Leetcode(三)无重复字符的最长子串
3. 无重复字符的最长子串
题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
思路一:暴力解决法
最暴力的解决方法是这样的,遍历该字符串的所有子字符串,并去除掉所有包含重复字符的子字符串。这样的话找出的最长子串就是我们需要的答案。其中去除含有重复字符的子字符串的方法是利用hashSet逐步添加子字符串字符,若已存在则重复。
代码:
public int lengthOfLongestSubstring(String s) {
int n = s.length();
int length = 0;
for (int i = 0; i < n; i++)
for (int j = i + 1; j <= n; j++)
if (allUnique(s, i, j)) length = Math.max(ans, j - i);
return length;
}
public boolean allUnique(String s, int start, int end) {
Set<Character> set = new HashSet<>();
for (int i = start; i < end; i++) {
Character ch = s.charAt(i);
if (set.contains(ch)) return false;
set.add(ch);
}
return true;
很明显该方法时间复杂度为O(n^3),是肯定不能通过的。
思路二:hashset滑动窗口解法
思路是这样的,使用hashSet表示了一个[i j)左闭右开的滑动窗口,该滑窗表示当前子字符串。当该窗口j向右滑动时,先判断s.charAt(j)是否在HashSet中,若不在,将其放入滑窗里。如果在的话,需要将滑动窗口以存在的字符删除,并将新的字符放入。
注意,删除已存在字符的时候,该字符前面如果有字符的话也要删除。 例如hashSet中此时是{a,b,c}此时j向右滑动一位,s.charAt(j)为c,那么a会先被删除,接着是b,最后删除和s.charAt(j)相同的c,此时hashSet为空了。删除完成后,下一步就是将新的c放入hashSet。
int n = s.length();
Set<Character> set = new HashSet<>();
int length = 0, i = 0, j = 0;
while (i < n && j < n) {
if (!set.contains(s.charAt(j))){
set.add(s.charAt(j++));
length = Math.max(ans, j - i);
}
else {
set.remove(s.charAt(i++));
}
}
return length;
该方法的时间复杂度为O(2n)=O(n)。
思路三:HashMap优化滑动窗口
我们很容易发现,我们可以进一步优化hashSet滑动窗口的代码,如果我们将判断重复字符的方法从遍历HashSet集合,改为使用HashMap映射的话,我们找到重复的字符时,也不用像上面一个一个的删除,直接可以跳过这些字符。我们的O(2n)步骤就变为了O(n)。
int n = s.length();
int length= 0;
Map<Character, Integer> map = new HashMap<>();
for (int j = 0, i = 0; j < n; j++) {
if (map.containsKey(s.charAt(j))) {
i = Math.max(map.get(s.charAt(j)), i);
}
length = Math.max(length, j - i + 1);
map.put(s.charAt(j), j + 1);
}
return length;
思路四:字符数组索引
既然我们可以想到使用HashMap映射来存放子字符串,那么在字符串问题中,字符索引数组就很容易想到了。
int n = s.length(), length = 0;
int[] index = new int[26];
for (int j = 0, i = 0; j < n; j++) {
i = Math.max(index[s.charAt(j) - 'a'], i);
length = Math.max(length, j - i + 1);
index[s.charAt(j) - 'a'] = j + 1;
}
return length;
以上就是这个问题的一些解法了,答案参考了Leetcode的官方解答,有兴趣的可以自己看下
点击这里查看
Leetcode(三)无重复字符的最长子串的更多相关文章
- 【LeetCode】无重复字符的最长子串【滑动窗口法】
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc&quo ...
- Leetcode——3. 无重复字符的最长子串
难度: 中等 题目 Given a string, find the length of the longest substring without repeating characters. 给定一 ...
- [LeetCode] 3. 无重复字符的最长子串
题目链接:(https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/) 题目描述: 给定一个字符 ...
- 【leetcode 3. 无重复字符的最长子串】解题报告
思路:滑动窗口的思想 方法一:滑动窗口 int lengthOfLongestSubstring(string s) { /* 控制一个滑动窗口,窗口内的字符都是不重复的,通过set可以做到判断字符是 ...
- LeetCode 3: 无重复字符的最长子串 Longest Substring Without Repeating Characters
题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. Given a string, find the length of the longest substring withou ...
- 力扣Leetcode 3. 无重复字符的最长子串
无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...
- [LeetCode]3. 无重复字符的最长子串(滑动窗口)
题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc ...
- [LeetCode]3.无重复字符的最长子串(Java)
原题地址: longest-substring-without-repeating-characters/submissions 题目描述: 示例 1: 输入: s = "pwwkew&qu ...
- LeetCode OJ -- 无重复字符的最长子串
给定一个字符串,找出不含有重复字符的 最长子串 的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. 给定 ...
随机推荐
- Java框架spring学习笔记(十七):事务操作
事务操作创建service和dao类,完成注入关系 service层叫业务逻辑层 dao层单纯对数据库操作层,在dao层不添加业务 假设现在有一个转账的需求,狗蛋有10000元,建国有20000元,狗 ...
- pyautogui 文档(一):简介
PyAutoGUI 可实现控制鼠标.键盘.消息框.截图.定位等功能,最近做了个自动化需要这些,故了解并记录下 自动化需要操作win7上的一个app,用PyAutoGUI做的,定位坐标,点击鼠标等,但是 ...
- SpringBoot集成MyBatis的分页插件 PageHelper
首先说说MyBatis框架的PageHelper插件吧,它是一个非常好用的分页插件,通常我们的项目中如果集成了MyBatis的话,几乎都会用到它,因为分页的业务逻辑说复杂也不复杂,但是有插件我们何乐而 ...
- crm--分页
1. 给数据库添加数据 试图函数 (book表,含有title和price列) # 给数据库添加数据def index(request): book_list = [] for i in range ...
- java_26 缓冲流
1.缓冲流: 读取数据大量的文件时,读取的速度慢, java提供了一套缓冲流,提高IO流的效率.分为字节缓冲流和字符缓冲流. 字节缓冲流: 缓冲输出流:BufferedOutputStream 缓冲输 ...
- java搭建SSM的Web开发框架-整合这3者用到的配置文件
1./WEB-INF/web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmln ...
- linux 查看系统资源命令
vmstat vmstat 1 3 #每隔一秒刷新3次 lsof lsof | more #process->file lsof | /sbin/init #file->process l ...
- 涂色(CQOI2007)
--BZOJ1260_区间dp Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符串表示这个目标:R ...
- Unity - Photon PUN 本地与网络同步的逻辑分离 (二)
上篇实现了事件系统的设计,这篇就来结合发送RPC消息 并且不用标记 [PunRPC] 先来看下上编的代码 GameEnvent.cs private static Dictionary<Comm ...
- centos6.6安装Elasticsearch
1. 安装jar8 yum list java-1.8* sudo yum install java-1.8.0-openjdk* -y java --version 2. 安装elasticsear ...