第一个只出现一次的字符

Posted by DH on July 18, 2017

题目

在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置

分析

最容易想想到的就是从头开始取每一个字符,然后和后面的字符进行比较,加入比较到字符串尾,也没有找到相同的,这个就是第一个出现的字符。

分析这个思想的时间复杂度,n个长度的字符串,每一个字符都有可能和后面的字符相同,所以时间复杂度是O(n2)。

如何遍历一次,而得到所有字符出现的次数呢,就要使用到hashmap,其实就是键值对,我们可以用键存储出现过的字符,出现次数是对应的值。

然后,再遍历一遍,输出第一个值是1对应的键,在字符串中的位置,总共最多需要2n次,时间复杂度是O(n).

代码

import java.util.HashMap;
public class Solution {
    public int FirstNotRepeatingChar(String str) {
      
		HashMap< Character, Integer>  map= new HashMap<>();
		
		if (str.length() == 0 || str == null) {
			return -1;
		}
		
		// 利用hashmap,键是字符,值是出现的次数。
		
		for(int i = 0;i < str.length();i++){
			
			if (map.containsKey(str.charAt(i))) {
				int valueOfChar = map.get(str.charAt(i));
				valueOfChar +=1;
				map.put(str.charAt(i), valueOfChar);
			}else{
				map.put(str.charAt(i), 1);
			}
			
		}
		
		// 遍历
		for(int j = 0;j < str.length();j++){
			if (map.get(str.charAt(j))==1) {
				return j;
			}
			
		}
		return -1;
		

    }
    
}