题目:
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
案例:
s = “leetcode”
返回 0.
s = “loveleetcode”,
返回 2.
注意事项:您可以假定该字符串只包含小写字母。
代码:
package leetCode;
/**
* 2018.7.20 字符串的第一个唯一字符
*
* @author dhc
*
*/
public class ThreeHundredAndEightSeven {
//双重循环本办法,特殊情况考虑不全易出错 60ms(也是对String的方法不熟)
public static int firstUniqChar(String s) {
int index = -1;
char[] ss = s.toCharArray();
if(ss.length == 1) {
return 0;
}
if(ss.length == 0) {
return -1;
}
out:for(int i = 0;i < ss.length;i++) {
for(int j = 0;j < ss.length;j++) {
if(i == ss.length -1 && j == ss.length -1) {
index = ss.length -1;
}
if(ss[i] != ss[j] && j == ss.length -1 && i != j) {
index = i;
break out;
}
if(ss[i] == ss[j] && i != j) {
break;
}
}
}
return index;
}
//大佬答案1(思路清晰易懂,本人觉着这个方法挺好,简单直白)
public static int firstUniqChar1(String s) {
char[] ss = s.toCharArray();
for (int i = 0; i < ss.length; i++) {
char a = s.charAt(i);
if(s.indexOf(a) == s.lastIndexOf(a)) {
return i;
}
}
return -1;
}
//大佬答案2(有点绕)
public static int firstUniqChar2(String s) {
int[] charsCount = new int[26];
//按字母顺序标记处有哪些字符,并且保存对应的出现次数
for (int i = 0; i < s.length(); i++) {
charsCount[s.charAt(i) - 'a'] += 1;
}
for (int i = 0; i < s.length(); i++) {
//判断是否只出现依次,并且第一个出现一次的就返回
if (charsCount[s.charAt(i) - 'a'] == 1)
return i;
}
return -1;
}
//大佬答案3(有点绕)
public static int firstUniqChar3(String s) {
int result = -1;
for(char c = 'a';c<='z';c++){
int index = s.indexOf(c);
if(index != -1 && index == s.lastIndexOf(c)){
//有点绕,就是为了找出“第一个”唯一字符
result = result != -1?Math.min(result,index):index;
}
}
return result;
}
public static void main(String[] args) {
String str = "cc";
System.out.println(firstUniqChar2(str));
}
}