题目描述:
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
样例:
s = “leetcode”
返回 0.
s = “loveleetcode”,
返回 2.
分析:
建立哈希表存储每个字符以及字符对应的索引,并将该字符加入列表中。在遍历字符时首先判断该字符是否已经存在于哈希表,如果存在则将其从列表中移除;如果不存在则添加。直到最后如果列表不为空的话那么列表中的第一个元素即为首个不重复的字符。
public int FirstNotRepeatingChar(String str) {
if(str==null||str.length()==0)
return -1;
int index=-1;
Map<Character,Integer> set=new HashMap<>();
List<Character> list=new ArrayList<>();
for(int i=0;i<str.length();i++) {
if(set.containsKey(str.charAt(i))) {
if(list.contains(str.charAt(i)))
list.remove((Character)str.charAt(i));
}else {
set.put(str.charAt(i),i);
list.add(str.charAt(i));
}
}
if(list.size()>0)
index=set.get(list.get(0));
return index;
}
相关题目:字符流中第一个只出现一次的字符
请实现一个函数用来找出字符流中第一个只出现一次的字符。
例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是’g’。
当从该字符流中读出前六个字符”google”时,第一个只出现一次的字符是’l’。
如果当前字符流没有存在出现一次的字符,返回#字符。
List<Character> list=new ArrayList<>();
Set<Character> set=new HashSet<>();
//Insert one char from stringstream
public void insert(char ch){
if(set.contains(ch)) {
if(list.contains(ch))
list.remove((Character)ch);
}else {
set.add(ch);
list.add(ch);
}
}
//return the first appearence once char in current stringstream
public char firstAppearingOnce(){
if(list.size()>0)
return list.get(0);
else
return '#';
}