写在前面
最近想复习一下数据结构与算法相关的内容,找一些题来做一做。如有更好思路,欢迎指正。
目录
- 写在前面
- 一、场景描述
- 二、具体步骤
- 1.环境说明
- 2.代码
- 写在后面
一、场景描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 (子序列 )的长度。
示例1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。提示:请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
二、具体步骤
1.环境说明
名称 | 说明 |
---|---|
IntelliJ IDEA | 2019.2 |
2.代码
以下为Java版本实现:
public class Lc3_lengthOfLongestSubstring {public static void main(String[] args) {String s = "abcabcbb";
// String s = "bbbbb";
// String s = "pwwkew";System.out.println(lengthOfLongestSubstring(s));}/**** 思路:* 返回值是int,定义默认值max设置为0** 将字符串转转化为字符数组,借助于StringBuilder.indexOf(String str, int fromIndex)判断是否有重复字符* 如果有重复的字符,则从重复字符的下一位开始计算。不管有没有,都需要添加到builder中* 每循环一次,比较 builder.length() - fromIndex(重复时用于记录下一位) 的值与 max的大小** 说明:builder.length() - fromIndex就是本次循环,不重复的字符串的长度*** 定义 max,fromIndex,builder* for循环字符串s** int index = builder.indexOf(ch + "", fromIndex) != -1* index != -1, fromIndex = index + 1;* builder.append(ch)** int len = builder.length() - fromIndex;* 判断 len > max, max = len** 最后返回 max** @param s* @return*/private static int lengthOfLongestSubstring(String s) {int max = 0, fromIndex = 0;StringBuilder builder = new StringBuilder(s.length());for (char ch : s.toCharArray()) {// 找到重复位置,切记从开始位置开始int index = builder.indexOf(ch + "", fromIndex);if (index != -1) {fromIndex = index + 1;}builder.append(ch);int len = builder.length() - fromIndex;if (len > max) {max = len;}}return max;}
}
写在后面
如果本文内容对您有价值或者有启发的话,欢迎点赞、关注、评论和转发。您的反馈和陪伴将促进我们共同进步和成长。