题目:
在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
思路:初看题目,会想到从头开始扫描这个字符串中的每一个字符。当访问到某个字符的时候拿这个字符与后面的每个字符比较,如果在后面没有发现重复的字符说明该字符只出现一次。这样复杂度为O(n^2)。这时候我们想到了哈希表,key是字符,value是出现次数。还是需要我们扫描两次字符串。第一次扫描字符串的时候,每扫描一个字符就在哈希表的对应项中吧次数+1,;接下来第二次扫描,每扫描到一个字符就在哈希表中得到该字符的出现次数。这样第一个只出现一次的字符就是符合要求的字符。
代码如下:
import java.util.LinkedHashMap;
// use linkedhashmap to keep the order
public class Solution {
public int FirstNotRepeatingChar(String str) {
LinkedHashMap <Character, Integer> map = new LinkedHashMap<Character, Integer>();//构建哈希表,key-value
for(int i=0;i<str.length();i++){ //从头开始扫描检查字符是否在哈希表中
if(map.containsKey(str.charAt(i))){//如果在表中有找到字符,获取该字符的value,同time表示
int time = map.get(str.charAt(i));
map.put(str.charAt(i), ++time);//将键值对放进表中,更新出现的次数,即time++,
}
else {
map.put(str.charAt(i), 1); //若不在哈希表中,就添加表中
}
}
int pos = -1;
int i=0;
for(;i<str.length();i++){ //再次从头开始扫描哈希表,取出来第一个value是1的字符。若不存在就返回-1.
char c = str.charAt(i);
if (map.get(c) == 1) {
return i;
}
}
return pos;
}
}