LeetCode-探索-初级算法-字符串-3. 字符串中的第一个唯一字符(个人做题记录,不是习题讲解)
LeetCode探索-初级算法:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/
- 字符串中的第一个唯一字符
-
语言:java
-
思路:用数组1存储26字母出现次数,然后用数组2记录26字母出现次数为1的字母,然后查找在字符串中下标最小的一个。如果len<=1分别返回-1和0,而不用进行计算
-
代码(18ms):
class Solution { public int firstUniqChar(String s) { int len = s.length(); if(len==0) return -1; else if(len==1) return 0; else{ char tc; int[] arr = new int[26]; int[] res = new int[26]; int index = 0; for(int i = 0; i < len; ++i){ tc = s.charAt(i); arr[tc-97] += 1; } for(int i = 0;i<26;++i){ if(arr[i]==1) res[index++] = i; } if(index>0){ int min = s.indexOf(""+(char)(res[0]+97)); for(int i = 1; i < index; ++i){ int j = s.indexOf(""+(char)(res[i]+97)); if(j<min) min = j; } return min; } return -1; } } }
-
参考代码(1ms):转换思维,找到第一个唯一字符,即从头找和从尾找都是自己。循环使用字符作为条件,而不是直接遍历整个数组
class Solution { public int firstUniqChar(String s) { int index = s.length(); for (char k = 'a'; k <= 'z'; k++) { int p1 = s.indexOf(k);// -1 不存在 int p2 = s.lastIndexOf(k); if (p1 == p2 && p1 != -1) { index = Math.min(index, p1); } } if (index == s.length()) { return -1; } return index; } } /*巧用阿斯克码连续,直接去找每一个字母的位置 */
-
参考后重写(1ms):
class Solution { public int firstUniqChar(String s) { int len = s.length(); int res = len; int head = -1; int tail = -1; for(char letter = 'a'; letter <= 'z'; ++letter){ head = s.indexOf(letter); tail = s.lastIndexOf(letter); if(head==tail&&head!=-1) res = Math.min(res,head); } if(res==len) return -1; return res; } }