字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例:
s = “leetcode”
返回 0
s = “loveleetcode”
返回 2
(上述题目来源于LeetCode)
解法一
class Solution {
public int firstUniqChar(String s) {
//将字符串转换为数组
char s1[] = s.toCharArray();
//定义一个标记数组,用来标记数组中每一个字符
boolean []flag = new boolean[s1.length];
//循环遍历,如果有相同的字符,标记数组相应进行标记为true
for(int i=0;i<s1.length;i++){
for(int j=i+1;j<s1.length;j++){
if(s1[i] == s1[j]){
flag[i] = flag[j] = true;
}
}
}
//再次循环,返回第一个标记为false的数组下标
int k = 0;
while(k < flag.length){
if(flag[k] == false){
return k;
}
k++;
}
//如果没有标记为false的下标,返回-1
return -1;
}
}
解法二(利用HashMap,两次循环)
class Solution {
public int firstUniqChar(String s) {
//定义HashMap
Map<Character,Integer> count = new HashMap<Character,Integer>();
//第一次循环,将每个字符以及相应的出现次数放进HashMap
for(int i=0;i<s.length();i++){
char ch = s.charAt(i);
count.put(ch,count.getOrDefault(ch,0) + 1);
}
//第二次循环,查找HashMap中次数为1的第一个字符,返回其下标
for(int j=0;j<s.length();j++){
if(count.get(s.charAt(j)) == 1)
return j;
}
return -1;
}
}
解法三(利用C++的String容器类方法)
class Solution {
public:
int firstUniqChar(string s) {
//利用C++的String容器类方法
for(int i=0;i<s.size();i++){
if(s.find(s[i]) == s.rfind(s[i])){
return i;
}
}
return -1;
}
};
解法三中的find()方法意思是返回找到的第一个元素下标,而rfind()方法意思是返回找到的最后一个元素下标。此处的意思是如果找到的第一个下标和找到的最后一个下标刚好是同一个下标,那么这个元素在字符串中只出现过一次。