个人名片:
作者简介:一名大二在校生,热爱生活,爱好敲码!
\ 个人主页 :holy-wangle
➡系列内容: ️ tkinter前端窗口界面创建与优化
️ Java实现ATP小系统
✨个性签名: 不积跬步,无以至千里;不积小流,无以成江海
今天的算法题是关于字符串!
下面看看我们的题目是什么 。
无重复字符的最长字串
题目: 给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
从题目来看,很明显,这道题就是给定一个字符串的内容,让我们把含不重复字母的最长的字符串子串的长度求出来。
思路:
使用滑动窗口的思想去解决。
滑动窗口思想是非常重要的一种思想,可以用来解决数组,字符串的子元素问题。它可以将嵌套循环的问题,转换为单层循环问题,降低时间复杂度,提高效率。
滑动窗口的思想非常简单,它将子数组(子字符串)理解成一个滑动的窗口,然后将这个窗口在数组上滑动,在窗口滑动的过程中,左边会出一个元素,右边会进一个元素,然后只需要计算当前窗口内的元素值即可。
可用滑动窗口思想解决的问题,一般有如下特点:
算法思路
第 2 步相当于在寻找一个「可行解」,然后第 3 步在优化这个「可行解」,最终找到最优解。 左右指针轮流前进,窗口大小增增减减,窗口不断向右滑动。
下面是图解: ans代表最长不重复字符的字串的长度
遇到重复出现的字母start就跳转到字母那里,end一直往下走。
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 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"));
}
}
感谢各位的观看,创作不易,能不能给哥们来一个点赞呢!!!
好了,今天的分享就这么多了,有什么不清楚或者我写错的地方,请多多指教!
私信,评论我呗!!!!!!
关注我下一篇不迷路哦!