題目描述:
在一個字符串(0<=字符串長度<=10000,全部由字母組成)中找到第一個只出現一次的字符,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫)。
解題思路:
對於本題,這里給出以下三種解法:(1)用 HashMap 建立每個字符與其出現次數的映射,然后再依次遍歷字符串時,找到第一個出現次數為1的字符,返回其位置即可。(2)更進一步,因為該字符串全部是字母,所以可以用一個數組代替哈希表,數組下標就代表該字母。(3)使用模式匹配從前(indexOf)和從后(lastIndexOf)匹配每一個字符,相等即為唯一。
編程實現(Java):
//方法一:哈希表
public int FirstNotRepeatingChar(String s) {
Map<Character,Integer> map = new HashMap<Character,Integer>();
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
map.put(c,map.getOrDefault(c,0)+1);
}
for(int i=0;i<s.length();i++)
if(map.get(s.charAt(i))==1)
return i;
return -1;
}
//方法二:數組代替哈希表
public int FirstNotRepeatingChar(String str) {
if(str==null || str.length()==0)
return -1;
// A-Z對應的ASCII碼為65-90,a-z對應的ASCII碼值為97-122
int len=str.length();
int[] count=new int[58]; //122-65+1
for(int i=0;i<len;i++){
char c=str.charAt(i);
count[c-'A']++;
}
for(int i=0;i<len;i++){
char c=str.charAt(i);
if(count[c-'A']==1)
return i;
}
return -1;
}
//方法三:模式匹配
public int firstUniqChar(String s) {
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(s.indexOf(c)==s.lastIndexOf(c))
return i;
}
return -1;
}