【题目描述】
字母序连续字符串 是由字母表中连续字母组成的字符串。换句话说,字符串
"abcdefghijklmnopqrstuvwxyz"
的任意子字符串都是 字母序连续字符串 。
- 例如,
"abc"
是一个字母序连续字符串,而"acb"
和"za"
不是。给你一个仅由小写英文字母组成的字符串
s
,返回其 最长 的 字母序连续子字符串 的长度。示例 1:
输入:s = "abacaba" 输出:2 解释:共有 4 个不同的字母序连续子字符串 "a"、"b"、"c" 和 "ab" 。 "ab" 是最长的字母序连续子字符串。示例 2:
输入:s = "abcde" 输出:5 解释:"abcde" 是最长的字母序连续子字符串。提示:
1 <= s.length <= 105
s
由小写英文字母组成
题目链接:. - 力扣(LeetCode)
【解题代码】
public class LongestContinuousSubstring {public static void main(String[] args) {String s = "abcde"; //"abacaba";int result = new LongestContinuousSubstring().longestContinuousSubstring(s);System.out.println("最长的字母序连续子字符串的长度:" + result);}public int longestContinuousSubstring(String s) {int maxLen = 0, curLen = 1;int cur = 1;char lastChar = s.charAt(0);while (cur < s.length()) {char curChar = s.charAt(cur);if (curChar - lastChar == 1){curLen++;if (curLen == 26) return 26;} else{if (curLen > maxLen) maxLen = curLen;curLen = 1;}lastChar = curChar;cur++;}return curLen > maxLen ? curLen : maxLen;}public int longestContinuousSubstring1(String s) {int maxLen = 0, curLen = 1;int cur = 1;while (cur < s.length()) {if (s.charAt(cur) - s.charAt(cur - 1) == 1){curLen++;if (curLen == 26) return 26;} else{if (curLen > maxLen) maxLen = curLen;curLen = 1;}cur++;}return curLen > maxLen ? curLen : maxLen;}}
【解题思路】
根据题目描述,感觉这道题应该比较简单,就是从头到尾不断比较字符串中相邻得两个字符,如果后一个字符比前一个字符大1,那么当前子字符串就是连续的,将其长度加1,如果不是,那么当前连续子字符串就到此为止,重新开始计算新的子字符串。按照这个思路很快完成编码,并提交成功
【解题步骤】
- 定义相关变量:最大子字符串长度maxLen,当前子字符串长度curLen,当前字符串索引值cur,上一字符lastChar等
int maxLen = 0, curLen = 1; int cur = 1; char lastChar = s.charAt(0);
- 从头到尾依次获取字符串当前字符
while (cur < s.length()) {char curChar = s.charAt(cur);
- 如果当前字符串比上一字符串大1,那么当前子字符串就是连续的,将其长度加1
if (curChar - lastChar == 1){curLen++;if (curLen == 26) return 26; }
- 否则那么当前连续子字符串就到此为止,重新开始计算新的子字符串
else{if (curLen > maxLen) maxLen = curLen;curLen = 1; }
- 更新上一字符串值,以及更新当前字符串索引
lastChar = curChar; cur++;
- 返回最终结果
return curLen > maxLen ? curLen : maxLen;
【思考总结】
- 此题算法实现思路:从头到尾不断比较字符串中相邻得两个字符,如果后一个字符比前一个字符大1,那么当前子字符串就是连续的,将其长度加1,如果不是,那么当前连续子字符串就到此为止,重新开始计算新的子字符串。
- LeetCode解题之前,一定不要看题解,看了就“破功”了!