首页 > 解决方案 > String-Leetcode 中的第一个唯一字符

问题描述

我试过387.First Unique Character In A string

给定一个字符串 s,找到其中的第一个非重复字符并返回它的索引。如果不存在,则返回-1。

示例:1

 Input: s = "leetcode"
 
 Output: 0

示例:2

 Input: s = "loveleetcode"

 Output: 2

我一直在尝试这个问题。我想我们会一一挑选所有字符并检查是否存在重复字符从循环中中断。如果没有,则返回该索引。我已经考虑过一个我认为不是最有效的方法,但我想知道如何使用下面给出的方法解决这个问题:

public int firstUniqChar(String s) {
  for(int i=0;i<s.length();i++){
      for(int j=i+1;j<s.length();j++){
          if(s.charAt(i)==s.charAt(j)){
              break;
          }
          
      }
      
  }
    return -1;
}

我很困惑如何返回索引。之后我找不到逻辑:

for(int j=i+1;j<s.length();j++){
              if(s.charAt(i)==s.charAt(j)){
                  break;
              }
              
          }

如果有人可以帮我找出这里的逻辑。

标签: javastringfor-loopif-statement

解决方案


有 26 个可能的小写英文字母,因此您可以使用两个 26 元素数组。

一个数组 ,letterCount对每个字母进行计数。从 0 开始,每次对应的字母出现在文本字符串中时加 1。第二个数组position保存该字母第一次出现的位置,如果该字母从未出现,则为 -1。对于所有元素,您需要将该数组初始化为 -1。

按顺序处理字符串,记录初始位置,每个字母只记录一次,并增加字符串中每个字母的计数。

处理完字符串后,查看letterCount数组。如果没有计数为 1 的字母,则返回 -1。如果恰好一个字母的计数为 1,则从position数组中返回该字母的位置。如果多个字母计数为 1,则选择其位置值最低的一个。

使用两个循环是解决此问题的一种非常低效的方法。该字符串最长可达 100,000 个字符,并且您正在多次处理它。最好只处理一次,跟踪您到目前为止发现的内容。


推荐阅读