Leetcode-387-字符串中的第一个唯一字符
2018-08-02 本文已影响27人
WindMajor
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
案例:
s = "leetcode"
返回 0.
s = "loveleetcode",
返回 2.
注意事项:您可以假定该字符串只包含小写字母。
分析:
题意很简单,给定字符串从左向右,直到遇到一个是唯一的字符串,返回此索引值就可以。
解题的思路可以循环遍历做元素是否相同的比较,但这样太费时费力了。
而根据题目,对于每一个元素只关心是否有重复元素,并不关心有几个重复元素,所以最简单的方法就是利用接口 indexOf() 和 lastIndexOf()两个接口比对结果是否一致。
解法一:
List中有indexOf()和lastIndexOf()接口,我们把String字符串里面的每一个字符都放入List中,调用其相应接口进行判断。
Java解答如下:
public int firstUniqChar(String s) {
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
char ch = chars[i];
int index = s.indexOf(ch);
if (index == s.lastIndexOf(ch)) {
return index;
}
}
return -1;
}
解法二:
其实转换一下脑子的话,还有更简单的方法,因为把String字符串放入ArrayList中需要耗费不少时间和空间,那么就要想办法避免这些消耗。别忘了题目还给了一个限制条件,字符串都是小写的,那么我们就可以确定字符串中每一个字符的范围是从 a
到 z
的,我们可以遍历字符 a
到 z
,然后判断每一个字符在字符串里面是否存在,如果存在判断其indexOf()和lastIndexOf()的值是否相同,最后在找出index值最小的结果,就是题目所求结果。
Java解答如下:
public int firstUniqChar(String s) {
int result = -1;
for (char ch = 'a'; ch <= 'z'; ch++) {
int index = s.indexOf(ch);
if (index != -1 && index == s.lastIndexOf(ch)) {
result = (result == -1) ? index : Math.min(result, index);
}
}
return result;
}