题目描述
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -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;}