/*
*在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
*/
import java.util.*;
public class FirstNotRepeatingChar {
//暴力搜索法:O(n^2)
public int firstNotRepeatingChar(String str) {
if(str.length() == 0) return -1;
List<String> list = new ArrayList<String>();
int index = 0;
boolean flag = true;
for(int i = 0;i < str.length() - 1;i ++) {
char c = str.charAt(i);
//保证每一次内部循环的不会是以前执行过的字符
if(!list.contains(c + "")) {
list.add(c + "");
//System.out.println("遍历的字符:" + c);
flag = true; //每一次循环之前要将flag复位
for(int j = i + 1;j < str.length();j ++) {
if(str.charAt(j) == c) {
flag = false; //发现有重复,没找到,跳出循环
//System.out.println("发现有重复,跳出循环");
break;
}
}
}
//没有重复,找到了,跳出循环
if(flag == true) {
index = i;
//System.out.println("找到了跳出循环");
break;
}
}
return index;
}
//构造一个HashMap(键存字符,值存次数),首先统计出每个字符的出现次数;之后找出出现次数为1的第一个字符,时间复杂度为O(n)
public int firstNotRepeatingChar2(String str) {
if(str.length() == 0) return -1;
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
for(int i = 0;i < str.length();i ++) {
char c = str.charAt(i);
if(map.containsKey(c)) {
int times = map.get(c);
map.put(c, ++ times); //map里的key不能重复,因此会覆盖掉原来key里的value
}
else {
map.put(c, 1);
}
}
//System.out.println(map);
for(int i = 0;i < str.length();i ++) {
char c = str.charAt(i);
if(map.get(c) == 1) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
String str = "hhello";
System.out.println(new FirstNotRepeatingChar().firstNotRepeatingChar2(str));
}
}
来源:CSDN
作者:奇零可草
链接:https://blog.csdn.net/zhou15755387780/article/details/79163229