内容简介:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1:示例2:示例3:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1:
输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 复制代码
示例2:
输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 复制代码
示例3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
复制代码
解题思路
这里讲述的我自己的解题思路的确是笨的要死,不过也是我自己通过对问题的本质分析总结出来的,暂且记录一下,在有了自己的解题思路后去学习别人更加优秀的解题思想,对于我的提升还是蛮大的。
请看图:
首先对图中的变量做一下介绍:
char curchar; // 记录当前读取到的字符 String curMaxStr; // 记录最近最长无重复字符串 int curMaxLen; // 记录最近最长无重复字符串的长度 String totalMaxStr; // 记录总体最长无重复字符串 int totalMaxLen; // 记录总体最长无重复字符串的长度 复制代码
接下来是我对问题的思考:
- 对字符串进行for循环遍历,使用
curChar记录当前读取到的字符; - 判断
curMaxStr中有没有这个字符curChar,如果没有,就将这个字符拼接到curMaxStr,并且将curMaxLen加1,如果curMaxLen大于等于totalMaxLen,就将curMaxStr和curMaxLen赋值给totalMaxStr和totalMaxLen。 - 如果
curMaxStr有这个字符curChar,那么从当前位置向前反序遍历,必然能找到与之重复的那个字符的位置,将重复的字符之后到当前curChar位置的字符串赋值给curMaxStr,如果curMaxLen大于等于totalMaxLen,就将curMaxStr和curMaxLen赋值给totalMaxStr和totalMaxLen。
具体代码
public static int lengthOfLongestSubstring(String s) {
// 当字符串s的长度为0时,那么就没有最长子串了
char curChar;
String curMaxStr = "", totalMaxStr = "";
int curMaxLen = 0, totalMaxLen = 0;
if(s.length() == 0) {
totalMaxLen = 0;
}
for(int i = 0; i < s.length(); i++) {
curChar = s.charAt(i);
// 当前字符与当前最长字符串中的字符没有重复时
if (!curMaxStr.contains(String.valueOf(curChar))) {
// 将当前字符拼接到当前最长字符串上
curMaxStr += curChar;
// 当前最长长度+1
curMaxLen ++;
if (curMaxLen >= totalMaxLen) {
totalMaxStr = curMaxStr;
totalMaxLen = curMaxLen;
}
//System.out.println("++++curChar:" + curChar + " curMaxStr:" + curMaxStr + " curMaxLen:" + curMaxLen + " totalMaxStr:" + totalMaxStr + " totalMaxLen:" + totalMaxLen);
}
else {
// 记录重复点的位置
int repeatPos = i;
curMaxStr = String.valueOf(curChar);
curMaxLen = 1;
// i没有遍历到开始处,并且从重复位置向前移动的这个字符与重复字符不重复
while(i > 0 && s.charAt(i - 1) != curChar) {
curMaxStr = s.charAt(--i) + curMaxStr;
curMaxLen++;
//System.out.println("----curChar:" + curChar + " curMaxStr:" + curMaxStr + " curMaxLen:" + curMaxLen + " totalMaxStr:" + totalMaxStr + " totalMaxLen:" + totalMaxLen);
if (curMaxLen >= totalMaxLen) {
totalMaxStr = curMaxStr;
totalMaxLen = curMaxLen;
}
}
i = repeatPos;
}
}
return totalMaxLen;
}
复制代码
下面是我在结了这个问题之后,在评论区看到的别人的解法,感觉特别棒,在这里也分享处理,如果读者觉得我的想法太笨,可以看看这段代码:
public static int lengthOfLongestSubstring(String s) {
int maxLength = 0;
String str = "";
for (int i = 0; i < s.length(); i++) {
int index = str.indexOf(s.charAt(i));
str = str + s.charAt(i);
//出现重复
if(index >= 0) {
str = str.substring(index + 1);
} else {
if (str.length() > maxLength) {
maxLength = str.length();
}
}
}
return maxLength;
}
复制代码
以上所述就是小编给大家介绍的《LeetCode——无重复字符的最长子串》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 字符串、字符处理总结
- XML 非法字符(转义字符)
- 查找一个字符串中最长不含重复字符的子字符串,计算该最长子字符串的长度
- php删除字符串最后一个字符
- Python:如何用半角字符替换全角字符?
- 高频算法面试题(字符串)leetcode 387. 字符串中的第一个唯一字符
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。