LeetCode 387: 字符串中的第一个唯一字符 First Unique Character in a String

简介: 题目: 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。 Given a string, find the first non-repeating character in it and return it's index. If it doesn't exist, return -1. 案例: s = "leetcode" 返回 0. s = "loveleetcode", 返回 2. 注意事项:您可以假定该字符串只包含小写字母。

题目:

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

Given a string, find the first non-repeating character in it and return it's index. If it doesn't exist, return -1.

案例:

s = "leetcode"
返回 0.

s = "loveleetcode",
返回 2.

注意事项:您可以假定该字符串只包含小写字母。

Note: You may assume the string contain only lowercase letters.

解题思路:

​ 很简单的题,无非就是对字符串的字母进行频率统计,找到出现频率为1 的字母索引。

​ 借助哈希映射两次遍历完成。第一次遍历进行字母频率统计,Hash Map 的Key 为字母,Value 为出现频率。第二次遍历找到频率为 1 的字母索引返回即可。

​ 不同于单词频率统计,字母一共只有 26 个,所以可以直接利用 ASii 码表里小写字母数值从 97~122,直接用 int 型数组映射。建立映射:索引为 小写字母的 ASii 码值,存储值为出现频率。

哈希映射解题:

Java:

class Solution {
    public int firstUniqChar(String s) {
        char[] chars = s.toCharArray();//转成 Char 数组
        Map<Character, Integer> map = new HashMap<>();
        for (Character c: chars) map.put(c, map.getOrDefault(c, 0) + 1);//频率统计
        for (int i = 0; i < chars.length; i++) {
            if(map.get(chars[i])==1) return i;//找到词频为1的字母(只出现一次)返回其索引
        }
        return -1;
    }
}

Python:

class Solution:
    def firstUniqChar(self, s):
        count = collections.Counter(s)# 该函数就是Python基础库里词频统计的集成函数
        index = 0
        for ch in s:
            if count[ch] == 1:
                return index
            else:
                index += 1       
        return -1

数组映射解题:

Java:

class Solution {
    public int firstUniqChar(String s) {
        char[] chars = s.toCharArray();
        int base = 97;
        int[] loc = new int[26];
        for (char c:chars) loc[c - base] += 1;
        for (int i = 0; i < chars.length; i++) {
            if(loc[chars[i]-base]==1) return i;
        }
        return -1;
    }
}

Python 基础数据结构里没有 char 型,强行使用chr(i)转换,只会导致效率更低

字符串函数解题:

Java:

利用 Java 字符串集成操作函数解题,很巧妙,效率也很高。

其中:

indexOf(): 返回该元素第一次出现的索引,没有则返回 -1

lastIndex(): 返回该元素最后一次出现的索引,没有则返回 -1

class Solution {
    public int firstUniqChar(String s) {
        int res = s.length();
        for (int i = 'a'; i <= 'z'; i++) {
            int firstIndex = s.indexOf((char)i);
            if (firstIndex == -1) continue;
            int lastIndex = s.lastIndexOf((char)i);
            if (firstIndex == lastIndex) {//两次索引值相同则证明该字母只出现一次
                res = Math.min(firstIndex, res);//res 为只出现一次的字母中索引值最小的
            }
        }
        return res == s.length() ? -1 : res;
    }
}
目录
相关文章
|
1月前
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
68 0
Leetcode第三题(无重复字符的最长子串)
|
9天前
|
索引 Python
String(字符串)
String(字符串)。
15 3
|
1月前
|
NoSQL Redis
Redis 字符串(String)
10月更文挑战第16天
37 4
|
1月前
|
canal 安全 索引
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
34 5
|
1月前
|
存储 JavaScript 前端开发
JavaScript 字符串(String) 对象
JavaScript 字符串(String) 对象
43 3
|
2月前
|
存储 C++
C++(五)String 字符串类
本文档详细介绍了C++中的`string`类,包括定义、初始化、字符串比较及数值与字符串之间的转换方法。`string`类简化了字符串处理,提供了丰富的功能如字符串查找、比较、拼接和替换等。文档通过示例代码展示了如何使用这些功能,并介绍了如何将数值转换为字符串以及反之亦然的方法。此外,还展示了如何使用`string`数组存储和遍历多个字符串。
|
3月前
|
C# 开发者 UED
WPF开发者必备秘籍:深度解析文件对话框使用技巧,打开与保存文件原来如此简单!
【8月更文挑战第31天】在WPF应用开发中,文件操作是常见需求。本文详细介绍了如何利用`Microsoft.Win32`命名空间下的`OpenFileDialog`和`SaveFileDialog`类来正确实现文件打开与保存功能。通过示例代码展示了如何设置文件过滤器、初始目录等属性,并使用对话框进行文件读写操作。正确使用文件对话框能显著提升用户体验,使应用更友好易用。
83 0
|
3月前
|
API C# 开发者
WPF图形绘制大师指南:GDI+与Direct2D完美融合,带你玩转高性能图形处理秘籍!
【8月更文挑战第31天】GDI+与Direct2D的结合为WPF图形绘制提供了强大的工具集。通过合理地使用这两种技术,开发者可以创造出性能优异且视觉效果丰富的WPF应用程序。在实际应用中,开发者应根据项目需求和技术背景,权衡利弊,选择最合适的技术方案。
150 0
|
2月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
39 0
java基础(13)String类
|
1月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
56 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性

热门文章

最新文章

下一篇
无影云桌面