Given a string, find the first non-repeating character in it and return it's index. If it doesn't exist, return -1.
Examples:
s = "leetcode" return 0. s = "loveleetcode", return 2.
Note: You may assume the string contain only lowercase letters.
package leetcode;
public class First_Unique_Character_in_a_String_387 {
public int firstUniqChar(String s) {
char[] chars=s.toCharArray();
int[] ASCII=new int[128];
for(int i=0;i<s.length();i++){
ASCII[chars[i]]++;
}
for(int i=0;i<s.length();i++){
if(ASCII[chars[i]]==1){
return i;
}
}
return -1;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
First_Unique_Character_in_a_String_387 f=new First_Unique_Character_in_a_String_387();
System.out.println(f.firstUniqChar("loveleetcode"));
}
}
下面是大神的解法。
使用一个slow pointer来指向当前的unique字符,使用一个fast pointer来遍历字符串。fast pointer只加字符的个数。当fast pointer指向的字符和当前slow pointer指向的字符相同时,我们将slow pointer再指向下一个unique的字符或者未访问过的字符。
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;
}
}