java - String-Leetcode 中的第一个唯一字符
问题描述
我试过387.First Unique Character In A string
给定一个字符串 s,找到其中的第一个非重复字符并返回它的索引。如果不存在,则返回-1。
示例:1
Input: s = "leetcode" Output: 0
示例:2
Input: s = "loveleetcode" Output: 2
我一直在尝试这个问题。我想我们会一一挑选所有字符并检查是否存在重复字符从循环中中断。如果没有,则返回该索引。我已经考虑过一个我认为不是最有效的方法,但我想知道如何使用下面给出的方法解决这个问题:
public int firstUniqChar(String s) {
for(int i=0;i<s.length();i++){
for(int j=i+1;j<s.length();j++){
if(s.charAt(i)==s.charAt(j)){
break;
}
}
}
return -1;
}
我很困惑如何返回索引。之后我找不到逻辑:
for(int j=i+1;j<s.length();j++){
if(s.charAt(i)==s.charAt(j)){
break;
}
}
如果有人可以帮我找出这里的逻辑。
解决方案
有 26 个可能的小写英文字母,因此您可以使用两个 26 元素数组。
一个数组 ,letterCount
对每个字母进行计数。从 0 开始,每次对应的字母出现在文本字符串中时加 1。第二个数组position
保存该字母第一次出现的位置,如果该字母从未出现,则为 -1。对于所有元素,您需要将该数组初始化为 -1。
按顺序处理字符串,记录初始位置,每个字母只记录一次,并增加字符串中每个字母的计数。
处理完字符串后,查看letterCount
数组。如果没有计数为 1 的字母,则返回 -1。如果恰好一个字母的计数为 1,则从position
数组中返回该字母的位置。如果多个字母计数为 1,则选择其位置值最低的一个。
使用两个循环是解决此问题的一种非常低效的方法。该字符串最长可达 100,000 个字符,并且您正在多次处理它。最好只处理一次,跟踪您到目前为止发现的内容。
推荐阅读
- reactjs - 使用 axios 将更多数据与 formData 一起发送到 API
- netsuite - 是否可以在 Netsuite 的 SuiteScript 环境中使用 DOTENV?
- stream - 将视频分析元数据添加到现有的 RTSP 摄像机源
- json - 将 JSON 子对象转换为 Xamarin 表单中的表
- mediawiki - MediaWiki 模板:注意导入不完全正确
- python - Python ABC模块中的abstractclass(metaclass=ABCMeta)和class abstractclass(ABC)有什么区别?
- go - 计算通过网络接收的传入请求的大小
- r - 负载均衡器后面的 R-Shiny 脚本超时
- c++ - 为什么 EnumDomains/NextDomain 永远循环?
- java - DynamoDBMappingException:无法取消转换属性,预期值为 S