题目描述
给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求:
- 只包含 1 个字母(a-z, A-Z) 其余必须是数字;
- 字母可以在子串中的任意位置;
如果找不到满足要求的子串,如全是字母或全是数字,则返回 -1
思路
假定有一个字母,统计其左右的数字的数量,数量和即为符合条件的子串。
当遇到一个字母的时候,现有左边的数字数量为原有右边的数字数量,右边数字数量置零,重新开始统计。
当遇到一个数字的时候,右边数字数量 ++。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Solution { public int lengthOfLongestSubstring(String s) {
boolean isAllLetter = true; boolean isAllNumber = true;
int res = 0;
int leftNumCount = 0; int rightNumCount = 0;
for (int i = 0; i < s.length(); i++) { if (Character.isAlphabetic(s.charAt(i))) { isAllNumber = false; leftNumCount = rightNumCount; rightNumCount = 0; } else { isAllLetter = false; rightNumCount++; } res = Math.max(res, rightNumCount + leftNumCount + 1); }
res = isAllLetter || isAllNumber ? -1 : res;
return res; } }
|
复杂度分析
- 时间复杂度分析: O(n) 遍历了一遍字符串
- 空间复杂度分析: O(1) 只用了有限个的标志变量