public class Solution { public int lengthOfLongestSubstring(String s) { if (s.length() == 0) { return 0; } int maxLength = 0; char[] array = s.toCharArray(); int[] record = new int[array.length]; for (int i = 0; i < array.length; i++) { if (i == 0) { record[i] = 1; } else { record[i] = record[i - 1]+ (checkRepeat(s.substring(i - record[i - 1], i + 1)) ? 1: 0); } } return record[record.length - 1]; } public boolean checkRepeat(String s) { char[] array = s.toCharArray(); boolean[] map = new boolean[256]; for (int i = 0; i < map.length; i++) { map[i] = false; } for (int i = 0; i < array.length; i++) { if (map[array[i]]) { return false; } map[array[i]] = true; } return true; } }
第一次做这到题的思路,从0到字符串长度,一个字符一个字符的添加。record数组index记录 0-index长度字串的解。
1. 一个字符的时候的解肯定为1;
2. 后面添加一个字符就取 之前解的长度的字串并上最后一个字符的字串,检查是否有重复。在之前字符的解的基础上有重复的话解+0,没重复的话解+1。
然后,参考了一些大神的解法:
public class Solution { public int lengthOfLongestSubstring(String string) { int[] a = new int[256]; char[] s = string.toCharArray(); int len = s.length; int result = 0, max = 0; int temp = 0, low = 0; for (int i = 0; i < len; ++i) { temp = a[s[i]]; if (temp != 0) { for (int j = low; j < temp - 1; j++) { a[s[j]] = 0; } result -= temp - low - 1; low = temp; a[s[i]] = i + 1; } else { a[s[i]] = i + 1; if (++result > max) max = result; } } return max; } }
这种方法的复杂度为O(n),对字符串长度的数组只扫描一次。思路是low记录起点,a记录起点之后的字符出现的位置+1,result记录起点之后不含重复字母的字串的长度。
时间: 2024-10-10 05:54:29