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中需要耗费不少时间和空间,那么就要想办法避免这些消耗。别忘了题目还给了一个限制条件,字符串都是小写的,那么我们就可以确定字符串中每一个字符的范围是从 az 的,我们可以遍历字符 az,然后判断每一个字符在字符串里面是否存在,如果存在判断其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;
    }
上一篇下一篇

猜你喜欢

热点阅读