个人名片:
🐅作者简介:一名大二在校生,热爱生活,爱好敲码!
\ 💅个人主页 🥇:holy-wangle
➡系列内容: 🖼️ tkinter前端窗口界面创建与优化
🖼️ Java实现ATP小系统
✨个性签名: 🍭不积跬步,无以至千里;不积小流,无以成江海
今天的算法题是关于字符串!
下面看看我们的题目是什么 。
无重复字符的最长字串
题目: 给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
从题目来看,很明显,这道题就是给定一个字符串的内容,让我们把含不重复字母的最长的字符串子串的长度求出来。
思路:
使用滑动窗口的思想去解决。
滑动窗口思想是非常重要的一种思想,可以用来解决数组,字符串的子元素问题。它可以将嵌套循环的问题,转换为单层循环问题,降低时间复杂度,提高效率。
滑动窗口的思想非常简单,它将子数组(子字符串)理解成一个滑动的窗口,然后将这个窗口在数组上滑动,在窗口滑动的过程中,左边会出一个元素,右边会进一个元素,然后只需要计算当前窗口内的元素值即可。
可用滑动窗口思想解决的问题,一般有如下特点:
- 窗口内元素是连续的。就是说,抽象出来的这个可滑动的窗口,在原数组或字符串上是连续的。
- 窗口只能由左向右滑动,不能逆过来滑动。就是说,窗口的左右边界,只能从左到右增加,不能减少,即使局部也不可以。
算法思路
- 使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为一个「窗口」。
- 先不断地增加 right 指针扩大窗口 [left, right],直到窗口符合要求。
- 停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的字符串不再符合要求。同时,每次增加 left,我们都要更新一轮结果。
- 重复第 2 和第 3 步,直到 right 到达尽头。
第 2 步相当于在寻找一个「可行解」,然后第 3 步在优化这个「可行解」,最终找到最优解。 左右指针轮流前进,窗口大小增增减减,窗口不断向右滑动。
java代码实现:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/*
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
*/
class FindLength{
public int lengthOfLongestSubstring(String s)
{
int n = s.length(),ans = 0;
Map<Character,Integer> map = new HashMap<>();
for (int end = 0,start = 0; end < n ; end++) {
char mark = s.charAt(end);
if (map.containsKey(mark))
{
start = Math.max(map.get(mark),start);
}
ans = Math.max(ans,end - start +1);
map.put(mark,end+1);
}
return ans;
}
}
public class Lcode_2 {
public static void main(String[] args) {
FindLength f = new FindLength();
System.out.println(f.lengthOfLongestSubstring("ass"));
}
}
感谢各位的观看,创作不易,能不能给哥们来一个点赞呢!!!
好了,今天的分享就这么多了,有什么不清楚或者我写错的地方,请多多指教!
私信,评论我呗!!!!!!
关注我下一篇不迷路哦!