• LeetCode算法题-First Unique Character in a String(Java实现)


    这是悦乐书的第213次更新,第226篇原创

    01 看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第81题(顺位题号是387)。给定一个字符串,找到它中的第一个非重复字符并返回它的索引。 如果它不存在,则返回-1。例如:

    输入:“leetcode”
    输出:0

    输入:“loveleetcode”,
    输出:2

    注意:您可以假设该字符串仅包含小写字母。

    本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

    02 第一种解法

    直接使用字符串自带的方法indexOf和lastIndexOf,只要这两个方法找到当前字符所在的索引相等,即表示当前字符就是第一个非重复字符。

    此解法的时间复杂度最好的情况是O(n),最坏的情况是O(n^2),空间复杂度是O(1)。

    public int firstUniqChar(String s) {
        for(int i=0; i<s.length(); i++){
            if (s.indexOf(s.charAt(i)) == s.lastIndexOf(s.charAt(i))) {
                return i;
            }
        }
        return -1;
    }
    

    03 第二种解法

    因为题目给定范围是局限于小写字母,可以使用一个长度为26的数组,存储每个字符出现的次数,然后再去数组中找到只出现一次的字符,返回索引即可。

    此解法的时间复杂度是O(n),空间复杂度是O(1),因为数组长度是定长的。

    public int firstUniqChar2(String s) {
        int[] arr = new int[26];
        for (int i=0; i<s.length(); i++) {
            arr[s.charAt(i)-'a']++;
        }
        for (int j=0; j<s.length(); j++) {
            if (arr[s.charAt(j)-'a'] == 1) {
                return j;
            }
        }
        return -1;
    }
    

    04 第三种解法

    此解法和第二种解法思路一致,区别在于数组容量变成了256,可以直接使用当前字符所表示的整数,而不必像第一种解法那样要减去字符小写a的值。

    此解法的时间复杂度是O(n),空间复杂度是O(1),因为数组长度是定长的。

    public int firstUniqChar3(String s) {
        int[] arr = new int[256];
        for (int i=0; i<s.length(); i++) {
            arr[s.charAt(i)]++;
        }
        for (int j=0; j<s.length(); j++) {
            if (arr[s.charAt(j)] == 1) {
                return j;
            }
        }
        return -1;
    }
    

    05 第四种解法

    使用HashMap,key为当前字符,value为其出现次数,先使用循环,将所有字符put进去。再利用循环,判断当前字符作为key在map中的value是否等于1,如果相等,返回当前索引。

    此解法的时间复杂度是O(n),空间复杂度是O(1),因为map中至多会存储26个键值对。

    public int firstUniqChar4(String s) {
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        for(int j=0; j<s.length(); j++){
            map.put(s.charAt(j), map.getOrDefault(s.charAt(j), 0)+1);
        }
        for (int i=0; i<s.length(); i++) {
            if (map.get(s.charAt(i)) == 1) {
                return i;
            }
        }
        return -1;
    }
    

    06 小结

    算法专题目前已连续日更超过两个月,算法题文章81+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

    以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

  • 相关阅读:
    golang删除数组某个元素
    golang用通道实现信号量,控制并发个数
    什么是ScaleIO中的forwards rebuild和backwards rebuild?
    SQL Server中的database checkpoint
    如何将thick provision lazy zeroed的VMDK文件转换为thick provision eager zeroed?
    LoadTestAgentResultsLateException in VS2010
    SQL Server Instance无法启动了, 因为TempDB所在的分区没有了, 怎么办?
    VMware vCenter中, 如何辩认虚机上Raw Device Mapping过了的一块物理磁盘?
    SQL Server AlwaysOn Setup Step-By-Step Guide
    TPC-E在populate测试Database时需要注意的一些事项
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/10177296.html
Copyright © 2020-2023  润新知