题目描述
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
案例:
s = "leetcode"
返回 0.
s = "loveleetcode",
返回 2.
注意事项:您可以假定该字符串只包含小写字母。
思路1:暴力破解法,时间复杂度:O(n^2),空间复杂度O(1)
/**
* 思路1:暴力破解
* @param s
* @return
*/
public int firstUniqChar(String s) {
if(s.length()==1) {
return 0;
}
for(int i=0;i<s.length();i++) {
int j=0;
for(j=0;j<s.length();j++) {
if(j==i) {
continue;
}
if(s.charAt(i) ==s.charAt(j)) {
break;
}else if (j == s.length()-1) {
return i;
}
}
if(i == s.length()-1 && j == s.length()) {
return s.length()-1;
}
}
return -1;
}
思路2
/**
* 思路2:
* 1:统计每个字母出现的次数(HashMap,key为char,value=次数)
* 2:查找仅出现一次的元素
* 时间复杂度O(n)
* 空间复杂度O(1)
* @param s
* @return
*/
public int firstUniqChar(String s) {
Map<Character, Integer> map = new HashMap<Character, Integer>();
for(int i=0;i<s.length();i++) {
map.put(s.charAt(i), map.get(s.charAt(i))==null?1:map.get(s.charAt(i))+1);
}
for(int i=0;i<s.length();i++) {
if(map.get(s.charAt(i)) ==1) {
return i;
}
}
return -1;
}
思路3
当前最佳
/**
* 思路3:利用其只有小写字母,特别定制版。
* 开一个26位字母表,元素初始化为n(n>s.length())。然后遍历s,每个字符去查找字母表,如果为n,则置为字符的index,如果不为n,则置为n+1.
* 最终,字母表最小的元素就是答案
* 时间复杂度O(n),空间复杂度O(1)
* @param s
* @return
*/
public int firstUniqChar(String s) {
if(s.length() == 1) {
return 0;
}
int len = s.length();
int[] arr = new int[26];
for(int i=0;i<arr.length;i++) {
arr[i] = len;
}
for(int i=0;i<len;i++) {
int index = s.charAt(i) - 'a';
if(arr[index] == len) {
arr[index] =i;
}else if (arr[index] < len) {
arr[index] =len+1;
}
}
int min =len;
for(int item:arr) {
if(item < min) {
min=item;
}
}
return min<len?min:-1;
}