这道题用hash思想加二维数组的思想,用第一维度记出现次数,第二维度记字符串中的位置,时间复杂度O(n)
public class Solution {
public int firstUniqChar(String s) {
char[] sA = s.toCharArray();
int[][] alphabet = new int[26][2];
int index = 0,min = -1;
if(sA.length>0){
for (char a : sA){
alphabet[a-'a'][0]++;
alphabet[a-'a'][1] = index++;
}
for(int i= 0;i<alphabet.length;i++){
if(alphabet[i][0] == 1 &&(alphabet[i][1] < min || min==-1))
min = alphabet[i][1];
}
}
return min;
}
}
下面这种网上的思想跟我也有异曲同工之妙但是比我的要慢不少
public class Solution {
public int firstUniqChar(String s) {
if (s.isEmpty()) return -1;
int[] hashTable = new int[26];
for(int i = 0; i < s.length(); i++) {
hashTable[(int) s.charAt(i) - 'a']++;
}
for (int i = 0; i < s.length(); i++) {
if (hashTable[(int) s.charAt(i) - 'a'] == 1) {
return i;
}
}
return -1;
}
}
下面这种思想也很巧妙啊比我的还快1ms
public class Solution {
public int firstUniqChar(String s) {
if (s==null || s.length()==0) return -1;
int len = s.length();
if (len==1) return 0;
char[] cc = s.toCharArray();
int slow =0, fast=1;
int[] count = new int[256];
count[cc[slow]]++;
while (fast < len) {
count[cc[fast]]++;
// if slow pointer is not a unique character anymore, move to the next unique one
while (slow < len && count[cc[slow]] > 1) slow++;
if (slow >= len) return -1; // no unique character exist
if (count[cc[slow]]==0) { // not yet visited by the fast pointer
count[cc[slow]]++;
fast=slow; // reset the fast pointer
}
fast++;
}
return slow;
}
}
2016/8/26