子串和子序列

原因

今天在写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" 都是合法的子序列,虽然它们不是连续的字符片段,但保持了在原字符串中的相对位置关系
  • 子序列可以为空,也可以包含原字符串的所有字符(此时子序列就等于原字符串自身)。
  • 获取一个字符串的子序列无需考虑字符间的连续性,可以通过遍历并选择性地添加到新序列中来生成。

异同点

子串肯定是子序列,而子序列不一定是子串。

子串是连续的且不能为空,子序列不一定连续且可以为空

   子串 \epsilon 子序列

 最长无重复子串优解

采用滑动窗口的方法来解决上述问题,减少了时间的复杂度和空间的复杂度。

 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);
    }

参考

浅谈子串和子序列的相同点和不同点_子序列和子串的区别-CSDN博客

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值