Java算法练习题,每天进步一点点(1)

目录
  • 题目描述
    • 字符串的排列
  • 解题思路
  • 代码
  • 总结

题目描述

字符串的排列

难度:中等

给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。

换句话说,s1 的排列之一是 s2 的 子串。

示例 1:

输入:s1 = “ab” s2 = “eidbaooo”

输出:true

解释:s2 包含 s1 的排列之一 (“ba”).

示例 2:

输入:s1= “ab” s2 = “eidboaoo”

输出:false

提示:

1 <= s1.length, s2.length <= 104

s1 和 s2 仅包含小写字母

解题思路

题目大意: 就是看字符串s2是否包含s1的排列,所白了就是只要是连续包含s1的字符就行,不考虑顺序。

解题思路:
滑动窗口思想,来个need数组,来存所需的字符,同时定义l和r两个指针,不断右移右指针,同时更新need数组,如果符合情况就返回true,不符合继续移动窗口,最后还找不到符合的就返回false。

代码

class Solution {
    public boolean checkInclusion(String s1, String s2) {
        int l1 = s1.length();
        int l2 = s2.length();
        if (l1 > l2 || "".equals(s1) || "".equals(s2)) {
            return false;
        }
        //创建个need数组,表示所需要的字符以及个数,通过遍历s1的得到
        int[] need = new int[26];
        for (int i = 0; i < l1; i++) {
            need[s1.charAt(i) - 'a']++;
        }
        //滑动窗口
        int l = 0, r = 0;
        //如果l=l2-l1就可以停了,后面的长度都不够了
        while (l <= l2 - l1) {
            //如果符合条件,即need[s2.charAt(r) - 'a'] > 0,就是当前窗口右端碰到的的是需要的字符
            while (r < l + l1 && need[s2.charAt(r) - 'a'] > 0) {
                //更新所需的字符个数
                need[s2.charAt(r) - 'a']--;
                //扩大窗口范围
                r++;
            }
            //找到所符合的个数了,就是需要的子串已经找到了
            if (r == l + l1) {
                return true;
            }
            //移动左窗口,这样左边的字符从窗口中退出来了,就需要把need[s2.charAt(l) - 'a']++,维护need
            need[s2.charAt(l) - 'a']++;
            //移动左边的指针
            l++;
        }
        return false;
    }
}

完整代码【含测试代码和三种解决方案】

package com.keafmd.Likou.Day0729;
import java.util.Arrays;
import java.util.HashMap;
/**
 * Keafmd
 *
 * @ClassName: StringArrangement
 * @Description: https://leetcode-cn.com/problems/permutation-in-string/
 * @author: 牛哄哄的柯南
 * @date: 2021-07-29 9:11
 */
public class StringArrangement {
    public static void main(String[] args) {
        String s1 = "hello", s2 = "ooolleooolleh";
        boolean b = new StringArrangementSolution().checkInclusion(s1, s2);
        System.out.println(b);
    }
}
class StringArrangementSolution {
    public boolean checkInclusion(String s1, String s2) {
        int l1 = s1.length();
        int l2 = s2.length();
        if (l1 > l2 || "".equals(s1) || "".equals(s2)) {
            return false;
        }
        //创建个need数组,表示所需要的字符以及个数,通过遍历s1的得到
        int[] need = new int[26];
        for (int i = 0; i < l1; i++) {
            need[s1.charAt(i) - 'a']++;
        }
        //滑动窗口
        int l = 0, r = 0;
        //如果l=l2-l1就可以停了,后面的长度都不够了
        while (l <= l2 - l1) {
            //如果符合条件,即need[s2.charAt(r) - 'a'] > 0,就是当前窗口右端碰到的的是需要的字符
            while (r < l + l1 && need[s2.charAt(r) - 'a'] > 0) {
                //更新所需的字符个数
                need[s2.charAt(r) - 'a']--;
                //扩大窗口范围
                r++;
            }
            //找到所符合的个数了,就是需要的子串已经找到了
            if (r == l + l1) {
                return true;
            }
            //移动左窗口,这样左边的字符从窗口中退出来了,就需要把need[s2.charAt(l) - 'a']++,维护need
            need[s2.charAt(l) - 'a']++;
            //移动左边的指针
            l++;
        }
        return false;
    }
}
class StringArrangementSolution2 {
    public boolean checkInclusion(String s1, String s2) {
        int l1 = s1.length();
        int l2 = s2.length();
        if (s1 == null || s2 == null || l1 > l2 || s1 == "" || s2 == "") {
            return false;
        }
        int[] need = new int[26];
        for (int i = 0; i < l1; i++) {
            need[s1.charAt(i) - 'a']--;
        }
        int l = 0, r = 0;
        int count = 0;
        while (r < l2) {
            int x = s2.charAt(r) - 'a';
            need[x]++;
            while (need[x] > 0) {
                need[s2.charAt(l) - 'a']--;
                l++;
            }
            if (r - l + 1 == l1) {
                return true;
            }
            r++;
        }
        return false;
    }
}

class StringArrangementSolution1 {
    public boolean checkInclusion(String s1, String s2) {
        int l1 = s1.length();
        int l2 = s2.length();
        if (s1 == null || s2 == null || l1 > l2 || s1 == "" || s2 == "") {
            return false;
        }
        int[] num1 = new int[26];
        int[] num2 = new int[26];
        for (int i = 0; i < s1.length(); i++) {
            num1[s1.charAt(i) - 'a']++;
            num2[s2.charAt(i) - 'a']++;
        }
        if (Arrays.equals(num1, num2)) {
            return true;
        }

        int l = 0, r = 0;
        int count = 0;
        for (int i = l1; i < l2; i++) {
            num2[s2.charAt(i) - 'a']++;
            num2[s2.charAt(i - l1) - 'a']--;
            if (Arrays.equals(num1, num2)) {
                return true;
            }
        }
        return false;
    }
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java日常练习题,每天进步一点点(43)

    目录 1.在异常处理中,若try中的代码可能产生多种异常则可以对应多个catch语句,若catch中的参数类型有父类子类关系,此时应该将父类放在后面,子类放在前面. 2.下面有关servlet中init,service,destroy方法描述错误的是? 3.以下描述错误的一项是( )? 4.JSP 表达式的写法: 5.Panel 和 Applet 的默认布局管理器是( ) 6.What will be printed when you execute the following code? 7.

  • Java日常练习题,每天进步一点点(44)

    目录 1.AWT 中用来表示文本框的类是 ( ) 2.以下表达式的类型和值是什么?(注意整数除法)() 3.以下代码段执行后的输出结果为 4.Java的跨平台特性是指它的源代码可以在多个平台运行.() 5.方法通常存储在进程中的哪一区() 6.默认RMI采用的是什么通信协议? 7.J2EE中,当把来自客户机的HTTP请求委托给servlet时,会调用HttpServlet的( )方法 8.String str = new String("abc"),"abc"在内存

  • Java算法练习题,每天进步一点点(2)

    目录 题目描述 解题思路 代码 总结 题目描述 寻找两个正序数组的中位数 难度:困难 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 示例 2: 输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000 解释:合并数组 = [1,2,3,4] ,中

  • Java日常练习题,每天进步一点点(45)

    目录 1.下列说法哪个正确( ) 2.只有实现了()接口的类,其对象才能序列化. 3.在 java 中 , 一个类() 4. 5.要求匹配以下16进制颜色值,正则表达式可以为: #ffbbad #Fc01DF #FFF #ffE 6.下列语句哪一个是不正确的() 7.以下哪个不是Collection的子接口? 8.以下会产生信息丢失的类型转换是( ) 9.下列代码执行结果为() 10.Java多线程有几种实现方法? 答案汇总: 总结 1.下列说法哪个正确( ) 正确答案: C 不需要定义类,就能

  • Java算法练习题,每天进步一点点(1)

    目录 题目描述 字符串的排列 解题思路 代码 总结 题目描述 字符串的排列 难度:中等 给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列. 换句话说,s1 的排列之一是 s2 的 子串. 示例 1: 输入:s1 = "ab" s2 = "eidbaooo" 输出:true 解释:s2 包含 s1 的排列之一 ("ba"). 示例 2: 输入:s1= "ab" s2 = "eidboao

  • Java日常练习题,每天进步一点点(15)

    目录 1.main 方法是 Java Application 程序执行的入口点,以下描述哪项是合法的(). 2.一般情况下,以下哪个选项不是关系数据模型与对象模型之间匹配关系? 3.下列关于修饰符混用的说法,错误的是( ) 4.某程序要求每次输入只能是正整数,并且每次输入的数值要求必须是100的倍数且小于等于500,则下列哪个是正确的无效等价类( ) 5.根据以下代码段,下列说法中正确的是( ). 6.在创建派生类对象,构造函数的执行顺序() 7.关于下面的一段代码,以下哪些说法是正确的: 8.

  • Java日常练习题,每天进步一点点(16)

    目录 1.main 方法是 Java Application 程序执行的入口点,以下描述哪项是合法的(). 2.一般情况下,以下哪个选项不是关系数据模型与对象模型之间匹配关系? 3.下列关于修饰符混用的说法,错误的是( ) 4.某程序要求每次输入只能是正整数,并且每次输入的数值要求必须是100的倍数且小于等于500,则下列哪个是正确的无效等价类( ) 5.根据以下代码段,下列说法中正确的是( ). 6.在创建派生类对象,构造函数的执行顺序() 7.关于下面的一段代码,以下哪些说法是正确的: 8.

  • Java日常练习题,每天进步一点点(18)

    目录 1.main 方法是 Java Application 程序执行的入口点,以下描述哪项是合法的(). 2.一般情况下,以下哪个选项不是关系数据模型与对象模型之间匹配关系? 3.下列关于修饰符混用的说法,错误的是( ) 4.某程序要求每次输入只能是正整数,并且每次输入的数值要求必须是100的倍数且小于等于500,则下列哪个是正确的无效等价类( ) 5.根据以下代码段,下列说法中正确的是( ). 6.在创建派生类对象,构造函数的执行顺序() 7.关于下面的一段代码,以下哪些说法是正确的: 8.

  • Java日常练习题,每天进步一点点(62)

    目录 1.Java Application 源程序的主类是指包含有( )方法的类. 2.如果定义一种表达式结构:(+ 6 3)的值为9,(- 6 3)的值为3,( * 6 3)的值为18,( / 6 3)的值为2:那么对于表达式( * (- 16 (* 3 2 2 )) (+ 5 (/ 6 (- 5 3))))输出的结果为____. 3.给出以下代码 4.当编译并运行下面程序时会发生什么结果() 5.对于文件的描述正确的是( ) 6.以下代码执行的结果显示是多少( )? 7.以下哪几个是java

  • Java日常练习题,每天进步一点点

    目录 1.类 ABC 定义如下: 2.后端获取数据,向前端输出过程中,以下描述正确的是 3.在异常处理中,以下描述不正确的有 4.如果一个接口Cup有个方法use(),有个类SmallCup实现接口Cup,则在类SmallCup中正确的是? ( ) 5.下面的程序将来打印什么?() 6.执行以下程序后的输出结果是() 7.java语言的下面几种数组复制方法中,哪个效率最高? 8.有关会话跟踪技术描述正确的是() 9.关于Java内存区域下列说法不正确的有哪些 10.下面的Java赋值语句哪些是有

  • Java日常练习题,每天进步一点点(9)

    目录 1."先进先出"的容器是:( ) 2.不考虑反射机制,一个子类显式调用父类的构造器必须用super关键字.( ) 3.以下是java concurrent包下的4个类,选出差别最大的一个 4.判断对错.在java的多态调用中,new的是哪一个类就是调用的哪个类的方法. 5.下面属于java引用类型的有? 6.有以下程序段, 则下面正确的选项是() 7.往OuterClass类的代码段中插入内部类声明, 哪一个是错误的: 8.Java.Thread的方法resume()负责重新开始

  • Java日常练习题,每天进步一点点(14)

    目录 1.下面程序的运行结果:() 2.如果int x=20, y=5,则语句System.out.println(x+y +""+(x+y)+y); 的输出结果是() 3.有以下类定义: 4.以下代码的输出的正确结果是 5.下列说法正确的是() 6.以下代码输出的是: 7.非抽象类实现接口后,必须实现接口中的所有抽象方法,除了abstract外,方法头必须完全一致. 8.下列关于容器集合类的说法正确的是? 9.下面说法正确的是?() 10.下面的对象创建方法中哪些会调用构造方法 ()

  • Java日常练习题,每天进步一点点(13)

    目录 1.以下关于java封装的描述中,正确的是: 2.请问所有的异常类皆直接继承于哪一个类?() 3.Which statement is true for the class java.util.ArrayList? 4.以下 b 的值是: byte b = (byte)129; 5.哪个类可用于处理 Unicode? 6.下面代码的运行结果是( ) 7.以下哪些继承自 Collection 接口() 8.程序中常采用变量表示数据,变量具有名.地址.值.作用域.生存期等属性.关于变量的叙述,

随机推荐