利用滑动窗口对字符串进行操作

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

package list2;

import list1.ListNode;

import java.util.*;

/**
 * Created with IntelliJ IDEA.
 *
 * @author : Future master
 * @version : 1.0
 * @Project : Java算法联系
 * @Package : list2
 * @ClassName : TestOne.java
 * @createTime : 2021/11/3 18:35
 * @Email : 2467636181@qq.com
 * 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
 *
 */

public class TestOne {
    public int lengthOfLongestSubstring(String s) {//太厉害了这个算法,但是还是没有下面的那个算法效率高,下面那个算法看不懂
        int result = 0;//记录结果
        Set<Character> set = new HashSet<>();//存放字符
        for(int i = 0,j = 0;i<s.length();i++){//对字符串进行遍历
            while(set.contains(s.charAt(i))){//当这个集合中含有这个字符的时候就执行下面的语句
                set.remove(s.charAt(j++));//算法精华部分所在,提取出s字符串中在第一次出现重复字符串之前的所有字符都删掉
            }
            set.add(s.charAt(i));//set集合中添加该元素
            result = Math.max(result,i-j+1);//结果他就等于上一次结果和这次集合的长度大的那个
        }
        return result;//返回结果

//        // 记录字符上一次出现的位置//这个题解看不懂
//        int[] last = new int[128];
//        for(int i = 0; i < 128; i++) {
//            last[i] = -1;
//        }
//        int n = s.length();
//
//        int res = 0;
//        int start = 0; // 窗口开始位置
//        for(int i = 0; i < n; i++) {
//            int index = s.charAt(i);
//            start = Math.max(start, last[index] + 1);
//            res   = Math.max(res, i - start + 1);
//            last[index] = i;
//        }
//
//        return res;
    }

    public static void main(String[] args) {
        TestOne testOne = new TestOne();
        String s = "abcabcbb";
        int result = testOne.lengthOfLongestSubstring(s);
        System.out.println(result);
    }
}

s1 的排列之一是 s2 的 子串 。

package list2;

import jdk.swing.interop.SwingInterOpUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Queue;

/**
 * Created with IntelliJ IDEA.
 *
 * @author : Future master
 * @version : 1.0
 * @Project : Java算法联系
 * @Package : list2
 * @ClassName : TestTwo.java
 * @createTime : 2021/11/3 20:20
 * @Email : 2467636181@qq.com
 * 给你两个字符串s1和s2 ,写一个函数来判断 s2 是否包含 s1的排列。如果是,返回 true ;否则,返回 false 。
 *
 * 换句话说,s1 的排列之一是 s2 的 子串 。
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode-cn.com/problems/permutation-in-string
 */
public class TestTwo {
    public boolean checkInclusion(String s1, String s2) {//写了两个算法效率,都不咋地

        if(s1.length()>s2.length()){//如果s1长度比s2大直接返回false
            return false;
        }
        Map<Character,Integer> map1 = new HashMap<>();//新建一个s1 的map
        Map<Character,Integer> map2 = new HashMap<>();//新建一个s2 的map
        for(int i = 0;i<s1.length();i++){//将map1和map2进行初始化
            if(map1.containsKey(s1.charAt(i))){
                map1.put(s1.charAt(i),map1.get(s1.charAt(i))+1);
            }else{
                map1.put(s1.charAt(i),1);
            }
            if(map2.containsKey(s2.charAt(i))){
                map2.put(s2.charAt(i),map2.get(s2.charAt(i))+1);
            }else{
                map2.put(s2.charAt(i),1);
            }
        }
        if(map1.equals(map2))return true;//如果初始化的map就直接成立那么直接返回
        for(int i = s1.length();i<s2.length();i++){//进行对窗口的移动
            char tmp = s2.charAt(i-s1.length());//借助一个中间变量
            if(map2.get(tmp)==1){//将map2中的第一个进去的进行去除
                map2.remove(tmp);
            }else{
                map2.put(tmp,map2.get(tmp)-1);
            }
            if(map2.containsKey(s2.charAt(i))){//添加下一个元素
                map2.put(s2.charAt(i),map2.get(s2.charAt(i))+1);
            }else{
                map2.put(s2.charAt(i),1);
            }
            if(map1.equals(map2))return true;
        }
        return false;

//        char[] compare = s1.toCharArray();
//        Arrays.sort(compare);
//        String compareStr = new String(compare);
//        System.out.println(compareStr);
//        for(int i = 0;i<=s2.length()-s1.length();i++){
//            String s3 = s2.substring(i,i+s1.length());
//            char[] compare1 = s3.toCharArray();
//            Arrays.sort(compare1);
//            String compareStr1 = new String(compare1);
//            System.out.println(compareStr1);
//            if(compareStr.equals(compareStr1))return true;
//        }
//        return false;

    }
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "ccccbbbbaaaa";
        TestTwo testTwo = new TestTwo();
        System.out.println(testTwo.checkInclusion(s1,s2));

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

躺平崽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值