2019-03-18-算法-进化(字符串中的第一个唯一字符)

题目描述
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

案例:

s = "leetcode"
返回 0.

s = "loveleetcode",
返回 2.

注意事项:您可以假定该字符串只包含小写字母。

思路1:暴力破解法,时间复杂度:O(n^2),空间复杂度O(1)

/**
	 * 思路1:暴力破解
	 * @param s
	 * @return
	 */
public int firstUniqChar(String s) {
		if(s.length()==1) {
            return 0;
        }
		for(int i=0;i<s.length();i++) {
			int j=0;
			for(j=0;j<s.length();j++) {
				if(j==i) {
					continue;
				}
				if(s.charAt(i) ==s.charAt(j)) {
					break;
				}else if (j == s.length()-1) {
					return i;
				}
			}
			if(i == s.length()-1 && j == s.length()) {
				return s.length()-1;
			}
		}
		return -1;
    }

思路2

/**
	 * 思路2:
	 * 1:统计每个字母出现的次数(HashMap,key为char,value=次数)
	 * 2:查找仅出现一次的元素
	 * 时间复杂度O(n)
	 * 空间复杂度O(1)
	 * @param s
	 * @return
	 */
	public int firstUniqChar(String s) {
		Map<Character, Integer> map = new HashMap<Character, Integer>();
		for(int i=0;i<s.length();i++) {
			map.put(s.charAt(i), map.get(s.charAt(i))==null?1:map.get(s.charAt(i))+1);
		}
		for(int i=0;i<s.length();i++) {
			if(map.get(s.charAt(i)) ==1) {
				return i;
			}
		}
		return -1;
	}

思路3
当前最佳

/**
	 * 思路3:利用其只有小写字母,特别定制版。
	 * 开一个26位字母表,元素初始化为n(n>s.length())。然后遍历s,每个字符去查找字母表,如果为n,则置为字符的index,如果不为n,则置为n+1.
	 * 最终,字母表最小的元素就是答案
	 * 时间复杂度O(n),空间复杂度O(1)
	 * @param s
	 * @return
	 */
	public int firstUniqChar(String s) {
		if(s.length() == 1) {
			return 0;
		}
		int len = s.length();
		int[] arr = new int[26];
		for(int i=0;i<arr.length;i++) {
			arr[i] = len;
		}
		
		for(int i=0;i<len;i++) {
			int index = s.charAt(i) - 'a';
			if(arr[index] == len) {
				arr[index] =i;
			}else if (arr[index] < len) {
				arr[index] =len+1;
			}
		}
		int min =len;
		for(int item:arr) {
			if(item < min) {
				min=item;
			}
		}
		return min<len?min:-1;
	}

猜你喜欢

转载自blog.csdn.net/zhaohong_bo/article/details/88642137