您的位置:首页 > Web前端

《剑指offer》-找到字符串中第一个只出现一次的字符,并返回它的位置

2018-01-25 16:11 591 查看
/*
*在一个字符串(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));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐