当先锋百科网

首页 1 2 3 4 5 6 7

这个专栏 我将分享每日做的算法题的解题思路 秋招加油!
这是第六天 !!

017 含有所有字符的最短字符串

题目
在这里插入图片描述

AC代码

class Solution {
    public String minWindow(String s, String t) {
        if (s.length() < t.length()) {
            return "";
        }
        String result = "";
        int length = s.length();
        int[] cnt1 = new int[100];
        int[] cnt2 = new int[100];
        for (int i = 0; i < t.length(); i++) {
            cnt1[t.charAt(i) - 'A']++;
        }
        int left = 0, right = 0;
        while (right < s.length()) {
            cnt2[s.charAt(right) - 'A']++;
            while(check(cnt1, cnt2) && left<=right) {
                if (right - left + 1 <= length) {
                    length =right -left + 1;
                    result = s.substring(left,right+1);
                }
                cnt2[s.charAt(left)-'A']--;
                left++;
            }
            right++;
        }
        return result;
    }

    public boolean check(int[] c1, int[] c2) {
        for (int i = 0; i < 100; i++) {
            if (c2[i] < c1[i]) {
                return false;
            }
        }
        return true;
    }
}

这道题可以通过滑动窗口解决,当没有符合条件时,右边界不断扩大,左边界不变,当符合条件时,开始收缩左边界,找到当前符合的最小值,直至遍历结束。

018 有效的回文

题目
在这里插入图片描述

AC代码

class Solution {
    public boolean isPalindrome(String s) {
        StringBuilder str1 = new StringBuilder();
        for(int i = 0;i<s.length();i++){
            if(s.charAt(i)<='Z' && s.charAt(i)>='A'){
                str1.append(Character.toLowerCase(s.charAt(i)));
            }
            else if(s.charAt(i)<='z' && s.charAt(i)>='a' || s.charAt(i)<='9' && s.charAt(i)>='0'){
                str1.append(s.charAt(i));
            }
        }
        return str1.toString().equals(str1.reverse().toString());
    }
}

只需要对字符串筛选+判断即可,大写字符转小写,去除其他字符。

019 最多删除一个字符得到回文

题目
在这里插入图片描述

AC代码

class Solution {
    public boolean validPalindrome(String s) {
        StringBuilder str = new StringBuilder();
        str.append(s);
        if(str.toString().equals(str.reverse().toString())){
            return true;
        }
        int left = 0,right = s.length()-1;
        while(left<=right){
            if(str.charAt(left) == str.charAt(right)){
                left++;
                right--;
            }
            else if(check(str.substring(left+1,right+1)) || check(str.substring(left,right))){
                return true;
            }
            else{
                return false;
            }
        }
        return false;
    }
    
    public boolean check(String str1){
        StringBuilder s1 = new StringBuilder();
        s1.append(str1);
        if(s1.toString().equals(s1.reverse().toString())){
            return true;
        }
        return false;
    }
}

前后开始判断,当出现不同时,直接对里面的字符串判断,如果不是回文,则返回false,否则返回true。

020 回文子字符串的个数

题目
在这里插入图片描述
AC代码

class Solution {
    public int countSubstrings(String s) {
        int result = 0;
        for (int i = 0; i < s.length(); i++) {
            for(int j = i+1;j<=s.length();j++){
                if(check(s.substring(i,j))){
                    result++;
                }
            }
        }
        return result;
    }

    public boolean check(String str1){
        StringBuilder s1 = new StringBuilder();
        s1.append(str1);
        if(s1.toString().equals(s1.reverse().toString())){
            return true;
        }
        return false;
    }
}

截取字符串 + 判断是否回文

“放弃”二字15笔, “坚持”二字16笔, 放弃和坚持就在一笔之差! 差之毫厘,失之千里。 无论你睡多晚, 总有人比你更晚。 无论你起多早, 总有人比你更早。 无论你多努力, 总有人比你更努力。 不管你有多辛苦, 总有人比你更辛苦。 所以要持之以恒, 坚持就是胜利。