思路:
从题中给出的有效信息有两点:
- 找到第一个只出现一次的字符
- 区分大小写,从0开始计数
由于哈希函数对于hash值的算法的速度比较快,故此此字符串可以通过哈希数组来进行解答
方法一:哈希数组
具体做法:
先将数据存入哈希数组中,判断存在就存 -1, 不存在就存当前下标,再通过哈希数组遍历找到最小的下标返回即可,具体过程如下图所示
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int FirstNotRepeatingChar(String str) {
char[] c = str.toCharArray();
Map<Character,Integer> hm = new HashMap<Character,Integer>();
for (int i = 0; i < c.length; i++) {
//存在则放入,反之不放
if(hm.containsKey(c[i])){
hm.put(c[i],-1);
}else{
hm.put(c[i],i);
}
}
int firstIndex = c.length; char firstChar = ' ';
for (Map.Entry<Character,Integer> mn : hm.entrySet()) {
//遍历返回 大于 -1 且 第一个出现的字符
if(mn.getValue() > -1 && firstIndex > mn.getValue()){
firstIndex = mn.getValue();
firstChar = mn.getKey();
}
}
return firstIndex == c.length ? -1 : firstIndex;
}
} 复杂度分析:
- 时间复杂度:O(n),遍历了两次,常数省略
- 空间复杂度:O(n) ,申请了常数的char数组空间
方法二:遍历n次字符串
具体做法:
遍历n次字符串,用 flag 标记当前是否为第一个出现的第一个
public class Solution {
public int FirstNotRepeatingChar(String str) {
int len=str.length();
int flag=0;//记录当前字符是否唯一
for (int i = 0; i < len; i++) {
for (int j =0; j < len; j++) {
//j = i 跳过本次循环
if(j==i) continue;
//找到相同字符则退出循环,没有则继续遍历,直至循环结束
if(str.charAt(i)==str.charAt(j)){
flag=1;
break;
}
if(str.charAt(i)!=str.charAt(j)){
flag=0;
}
}
if(flag==0)
return i;
}
return -1;
}
}
复杂度分析:
- 时间复杂度:O(n^2) 遍历n次字符串,时间复杂度为n^2,n为字符串长度
- 空间复杂度:O(1) 未申请额外的空间

京公网安备 11010502036488号