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

帅比萌擦擦* 提交于 2019-11-26 18:28:17
/*
 *在一个字符串(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));
	}
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!