给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
案例:
s = "leetcode"
返回 0.
s = "loveleetcode",
返回 2.
注意事项:您可以假定该字符串只包含小写字母。
解法一:
暴力求解,两层 for 循环寻找所求字符的下标。
public int firstUniqChar(String s) {
int flag = 1;
int res = -1;
if (s.length() == 1) {
return 0;
}
for (int i = 0; i < s.length(); i++) {
flag = 1;
for (int j = 0; j < s.length(); j++) {
if (i != j && s.charAt(j) == s.charAt(i)) {
flag = 0;
break;
}
}
if (flag == 1) {
res = i;
break;
}
}
return res;
}
解法二:
利用字符串全是小写字母的特性,构造一个记录 a~z 字符个数的数组,然后遍历字符串进行判断。
public int firstUniqChar(String s) {
int[] temp = new int[26];
for (int i = 0; i < s.length(); i++) {
temp[s.charAt(i) - 'a']++;
}
for (int i = 0; i < s.length(); i++) {
if (temp[s.charAt(i) - 'a'] == 1)
return i;
}
return -1;
}
解法三:
同样利用全是小写字母的特性,获取每个 a~z 每个字母的首下标,再利用 String.lastIndexOf(char c)
获取该字母最后一次出现的下标,两者进行比较得到最小的那个。
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;
}