GitHub地址
题目
- 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
- Given a string, find the first non-repeating character in it and return it’s index. If it doesn’t exist, return -1.
示例
示例1:
- s = “leetcode”
- 返回 0.
示例2:
- s = “loveleetcode”,
- 返回 2.
代码
第一遍的思路,是将字符串转换成字符数组,然后第一次出现的索引如果等于最后一次出现的索引,那就说明这个元素只存在一个,没有则字符串中没有这个元素。
public static int firstUniqChar(String s) {
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (s.indexOf(String.valueOf(chars[i])) == s.lastIndexOf(chars[i])) {
return i;
}
}
return -1;
}
AC之后阅读别人写的代码,发现了String类已经提供了获取字符的方法,将代码修改成如下:
public static int firstUniqChar(String s) {
for (int i = 0; i < s.length(); i++) if (s.indexOf(String.valueOf(s.charAt(i))) == s.lastIndexOf(s.charAt(i))) return i;
return -1;
}
上面两个代码都击败了55%左右的人,下面是第一名的算法:
public int firstUniqChar(String s) {
int result = -1;
for(char c = 'a';c<='z';c++){
int index = s.indexOf(c);
if(index != -1 && index == s.lastIndexOf(c)){
result = result != -1?Math.min(result,index):index;
}
}
return result;
}
不知道为啥,总感觉这个算法比我写的还慢,可能是这个算法提交的时候测试用例比较少,嗯,一定是这样子。:)