题目描述
- 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
**知识点:**哈希
方法一:哈希法
- 遍历一遍自负循环,统计每个字符出现的次数。然后再遍历一遍字符串,找出答案
- 时间复杂度O(2n),需要遍历两次字符串
- 空间复杂度:O(n)
class Solution {
public:
int FirstNotRepeatingChar(string str) {
unordered_map<char, int> mp;
for (const char ch : str) {
++mp[ch];
}
for (int i=0; i<str.length(); ++i) {
if (mp[str[i]] == 1) return i;
}
return -1;
}
};
- 数组代替map
class Solution {
public:
int FirstNotRepeatingChar(string str) {
int mp[128] = {0};
for (const char ch : str) {
++mp[ch];
}
for (int i=0; i<str.length(); ++i) {
if (mp[str[i]] == 1) return i;
}
return -1;
}
};
java题解:
- 利用ASCII解题:
public class Solution {
public int FirstNotRepeatingChar(String str) {
if(str==null || str.length() == 0)return -1;
int[] count = new int[256];
//用一个类似hash的东西来存储字符出现的次数,很方便
for(int i=0; i < str.length();i++)
count[str.charAt(i)]++;
//其实这个第二步应该也是ka我的地方,没有在第一时间想到只要在遍历一遍数组并访问hash记录就可以了
for(int i=0; i < str.length();i++)
if(count[str.charAt(i)]==1)
return i;
return -1;
}
}
- 使用map解题:
Map<Character, Integer> hashMap = new LinkedHashMap<>();
public int FirstNotRepeatingChar(String str) {
if (str.length()>10000|str.length()<0) return -1;
int temp;
for (int i = 0; i < str.length(); i++){
if (hashMap.containsKey(str.charAt(i))){
temp = hashMap.get(str.charAt(i));
hashMap.put(str.charAt(i), ++temp);
}else {
hashMap.put(str.charAt(i),1);
}
}
Iterator iterator = hashMap.entrySet().iterator();
int value;
char ans = 0;
while (iterator.hasNext()){
Map.Entry entry = (Map.Entry) iterator.next();
value = (int) entry.getValue();
System.out.println(value);
if (value == 1){
ans = (char) entry.getKey();
break;
}
}
int index =str.indexOf(ans);
return index;
}