题目:

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -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;
}
}

欢迎关注微信公众号: 爱写Bug

LeetCode 387: 字符串中的第一个唯一字符 First Unique Character in a String的更多相关文章

  1. [Swift]LeetCode387. 字符串中的第一个唯一字符 | First Unique Character in a String

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

  2. 前端与算法 leetcode 387. 字符串中的第一个唯一字符

    目录 # 前端与算法 leetcode 387. 字符串中的第一个唯一字符 题目描述 概要 提示 解析 解法一:双循环 解法二:Set法单循环 算法 传入测试用例的运行结果 执行结果 GitHub仓库 ...

  3. Java实现 LeetCode 387 字符串中的第一个唯一字符

    387. 字符串中的第一个唯一字符 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = "leetcode" 返回 0. s = ...

  4. LeetCode初级算法之字符串:387 字符串中的第一个唯一字符

    字符串中的第一个唯一字符 题目地址:https://leetcode-cn.com/problems/first-unique-character-in-a-string/ 给定一个字符串,找到它的第 ...

  5. 【LeetCode】字符串中的第一个唯一字符

    [问题]给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. s = "leetcode" 返回 . s = "loveleetcode ...

  6. 力扣(LeetCode)字符串中的第一个唯一字符 个人题解

    给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = "leetcode" 返回 0. s = "loveleetcod ...

  7. Leecode刷题之旅-C语言/python-387 字符串中的第一个唯一字符

    /* * @lc app=leetcode.cn id=387 lang=c * * [387] 字符串中的第一个唯一字符 * * https://leetcode-cn.com/problems/f ...

  8. LeetCode初级算法--字符串02:字符串中的第一个唯一字符

    LeetCode初级算法--字符串02:字符串中的第一个唯一字符 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog. ...

  9. leecode刷题(13) -- 字符串中的第一个唯一字符

    leecode刷题(13) -- 字符串中的第一个唯一字符 字符串中的第一个唯一字符 描述: 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = & ...

随机推荐

  1. js知识点面试题

    网上看到的一个题,在这里存一下 此为题目function Foo() { getName = function () { alert (1); }; return this; } Foo.getNam ...

  2. Mac中创建一个OpenGL项目

    配置: OS X10.10 + Xcode 6.0 一.基本步骤 新建一个命令窗口项目 更改目标设备版本号为 OS X 8.0 添加库文件 GLUT.framework 和 OpenGL.framew ...

  3. python操作excel表

    1.新增表并添加数据: 2.给工作表添加表名称,给表数据添加格式: import xlsxwriterdatas=(['Rent',1000], ['Gas',100], ['fish','画画'], ...

  4. 更改路由器的外网IP

    此方法适用于通过路由器拨号上网的宽带,若宽带通过光猫拨号上网则需要将光猫改为桥接模式并在路由器中配置宽带账号和密码 测试环境: 路由器:TP-LINK TL-WDR7800千兆版 硬件版本:1.0 软 ...

  5. [译]Vulkan教程(17)帧缓存

    [译]Vulkan教程(17)帧缓存 Framebuffers 帧缓存 We've talked a lot about framebuffers in the past few chapters a ...

  6. Java replace() 方法 替换字符 也可用于 js 中

    JAVA中: public class Test { public static void main(String args[]) { String Str = new String("he ...

  7. 【Java基础】JDBC简明教程

    目录 1. 常用类 2. JDBC编程步骤 3. 事务处理 4. 数据库连接池 5. JDBC列子代码 6. 使用Apache的JDBC工具类 虽然在平时的开发过程中我们不会直接使JDBC的API来操 ...

  8. vue获取后端数据放在created还是mounted方法里面?

    问题提出: 我们知道一般vue使用ajax或者axios来获取后端数据,并且好像放在created里面和mounted里面都可以获取数据并正确渲染.那么放在created里面和mounted里面有什么 ...

  9. (转)阿里 RocketMQ 安装与简介

    原文:阿里 RocketMQ 安装与简介 一.简介 官方简介: l  RocketMQ是一款分布式.队列模型的消息中间件,具有以下特点: l  能够保证严格的消息顺序 l  提供丰富的消息拉取模式 l ...

  10. (转)RocketMQ工作原理

    原文:https://blog.csdn.net/lyly4413/article/details/80838716 1.消息中间件的发展: 第一代以ActiveMQ为代表,遵循JMS(java消息服 ...