第三十三题:第一次只出现一次的字符
题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
思路:
暴力解:
①遍历 对每个字符进行判断(是否再次出现)
②这里需要进行遍历的嵌套(双重遍历)
缺点:如果字符串太长,那么比较的时间太耗时
具体实现代码如下:
public class Solution {
public int FirstNotRepeatingChar(String str) {
// 代码的鲁棒性
if(str.length() == 0){
return -1;
}
// 第一次是为了取比较的值
for(int i = 0;i < str.length();i++){
// 取到比较的值后,进行逐一比较
for(int j = 0;j < str.length();j++){
if(str.charAt(i) == str.charAt(j) && i != j){
// 只要找了相同的值就退出循环(前提是两个值的位置不是同一个)
break;
}
// 如果没有找到与比较字符相同的,就说明该字符是第一个只出现一次的字符
if(str.charAt(i) != str.charAt(j) && j == str.length()-1){
return i;
}
}
}
return -1;
}
}
思路:
Hash表解:
①遍历 存放在Hash表中(LinkedHashMap)
②key = 字符 value = 字符出现的次数
③最后只要返回第一个 value = 1的字符即可
具体实现代码如下:
public class Solution {
public int FirstNotRepeatingChar(String str) {
// 代码的鲁棒性
if(str.length() == 0){
return -1;
}
// Hash表
Map<Character,Integer> map = new LinkedHashMap<>();
for(int i = 0; i < str.length();i++){
char a = str.charAt(i);
// hash表中不存在字符,就进行存储
if(!map.containsKey(a)){
map.put(a,1);
}else {
// hash表中存在字符,就进行 value +1
map.put(a,map.get(a)+1);
}
}
for (int i = 0; i < str.length(); i++){
// 获取第一个 value = 1 的字符
if (map.get(str.charAt(i)) == 1){
return i;
}
}
return -1;
}
}