字符串中的第一个唯一字符
题目(出自LeetCode)
-
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
-
示例:
- s = "leetcode" 返回 0
- s = "loveleetcode" 返回 2
-
提示:你可以假定该字符串只包含小写字母。
解题
1.初步尝试,没看官方题解,自己琢磨
- 题解
- 先把字符串Str 转成字符数组
- 构造一个LinkedHashSet存放不重复的字符、一个HashSet存放重复的字符
- 遍历字符数组
- if LinkedHashSet、HashSet中都不存在该字符,则存入LinkedHashSet
- else if LinkedHashSet存在该字符,说明字符重复,移出LinkedHashSet,加入HashSet
- 获取LinkedHash第一个不重复字符char,返回 Str.indexOf(char);若有执行return,则不会执行下一步了
- 返回-1
- 代码
class Solution { public int firstUniqChar(String s) { char[] charArray = s.toCharArray(); LinkedHashSet<Character> lhs = new LinkedHashSet<Character>(); HashSet<Character> hs = new HashSet<Character>(); for(char c : charArray){ if(!hs.contains(c) && !lhs.contains(c)) lhs.add(c); else if(lhs.contains(c)){ lhs.remove(c); hs.add(c); } } for(char c : lhs){ return s.indexOf(c); } return -1; } }
- 结果
- 执行用时:22 ms, 在所有 Java 提交中击败了67.92%的用户
- 内存消耗:38.8 MB, 在所有 Java 提交中击败了76.62%的用户
2.两次遍历(参考了大神数据结构和算法给出的题解)
- 题解
- 第一次遍历统计字符出现次数
- 第二次从头开始遍历字符串,其出现次数为一则直接返回索引
- 遍历完则返回-1
- 代码
class Solution { public int firstUniqChar(String s) { char[] charArray = s.toCharArray(); int[] count = new int[26]; for(char c : charArray){ ++count[c-'a']; } for(int i=0; i<s.length(); ++i){ if(count[charArray[i]-'a']==1) return i; } return -1; } }
- 结果
- 执行用时:5 ms, 在所有 Java 提交中击败了94.04%的用户
- 内存消耗:39 MB, 在所有 Java 提交中击败了43.16%的用户
3.使用API[手动狗头][年轻人不讲武德!]
- 题解
- 遍历字符串,indexOf()和lastIndexOf()查出的索引是同一个的话,就说明它不重复,直接返回索引
- 代码
class Solution { public int firstUniqChar(String s) { for (int i = 0; i < s.length(); i++) if (s.indexOf(s.charAt(i)) == s.lastIndexOf(s.charAt(i))) return i; return -1; } }
- 结果
- 执行用时:33 ms, 在所有 Java 提交中击败了48.62%的用户
- 内存消耗:38.8 MB, 在所有 Java 提交中击败了77.72%的用户