原因
今天在写LeetCode中的一道中等难道题——《无重复字符的最长子串》时在它的题目中看见了它的提示:
刚好因为一些粗心我的代码出现了它提示的答案“pwke”,所以我上网查找资料对子串和子序列这方面的知识进行了补全。
先展示一下我的错误代码
public static void main(String[] args) {
String s="pwwkew";
int max = 1;
for (int i = 0; i < s.length(); i++) {
String temp = s.substring(i,i+1);
int length=1;
for (int j = i + 1 ; j < s.length(); j++) {
String s1=s.substring(j,j+1);
if (! temp.contains(s1)) {
temp += s.substring(j,j+1);
length++;
}else {
continue;
}
}
if (max<length){
max = length;
System.out.println("max s:"+temp);
}
}
System.out.println(max);
}
其实就是不小心把break写成了continue......
子串和子序列的介绍
子串(Substring)
- 子串是指原字符串中连续的一段字符组成的序列。换句话说,子串是从原字符串中选取的一个或多个相邻字符构成的新字符串。例如,在字符串 "abcdefg" 中,"abc"、"def" 和 "cde" 都是合法的子串,因为它们都是原字符串中的连续部分。
- 子串的长度至少为1,也可以是整个原字符串(即原字符串本身也是它自己的子串)。
- 在数据结构和算法中,获取一个字符串的子串通常是通过指定起始索引和结束索引实现的,如在Java中可以使用
substring(startIndex, endIndex)
方法。
子序列(Subsequence)
- 子序列是从原序列中任意选取若干个元素组成的新序列,且这些元素在新序列中的相对顺序与原序列相同,但是允许跳过某些元素。
- 在字符串 "abcdefg" 中,"aceg"、"adg" 和 "bdf" 都是合法的子序列,虽然它们不是连续的字符片段,但保持了在原字符串中的相对位置关系。
- 子序列可以为空,也可以包含原字符串的所有字符(此时子序列就等于原字符串自身)。
- 获取一个字符串的子序列无需考虑字符间的连续性,可以通过遍历并选择性地添加到新序列中来生成。
异同点
子串肯定是子序列,而子序列不一定是子串。
子串是连续的且不能为空,子序列不一定连续且可以为空
子串 子序列
最长无重复子串优解
采用滑动窗口的方法来解决上述问题,减少了时间的复杂度和空间的复杂度。
public static void main(String[] args) {
String s = "pwwkew";
int maxLen = 0;
int left = 0;
int[] charMap = new int[128];
for (int right = 0; right < s.length(); right++) {
char c = s.charAt(right);
charMap[c]++;
while (charMap[c] > 1) { // 如果字符重复出现
char leftChar = s.charAt(left);
charMap[leftChar]--;
left++;
}
maxLen = Math.max(maxLen, right - left + 1); // 更新最大长度
}
System.out.println("最长无重复字符子串的长度是: " + maxLen);
}