389周赛总结

3083. 字符串及其反转中是否存在同一子字符串

难度:731

给你一个字符串 s ,请你判断字符串 s 是否存在一个长度为 2 的子字符串,在其反转后的字符串中也出现。

如果存在这样的子字符串,返回 true;如果不存在,返回 false 。

示例 1:

输入:s = "leetcode"

输出:true

解释:子字符串 "ee" 的长度为 2,它也出现在 reverse(s) == "edocteel" 中。

示例 2:

输入:s = "abcba"

输出:true

解释:所有长度为 2 的子字符串 "ab""bc""cb""ba" 也都出现在 reverse(s) == "abcba" 中。

示例 3:

输入:s = "abcd"

输出:false

解释:字符串 s 中不存在满足「在其反转后的字符串中也出现」且长度为 2 的子字符串。

提示:

  • 1 <= s.length <= 100
  • 字符串 s 仅由小写英文字母组成。

 状态:完成,但是方法不好,看了灵山的代码确实可以

思路:构建一个26*26的二维数组arr,arr[i][j]表示下标‘ij’是否在原来的s中出现过。这样子遍历一遍数组就可以得出字符串中是否存在相邻可以倒置的两个字符串。

class Solution {
    public boolean isSubstringPresent(String s) {
        char[] arr=s.toCharArray();
        boolean[][] list=new boolean[26][26];
        if(arr.length==1) return false;
        for(int i=0;i<arr.length-1;i++){
            char a=arr[i];
            char b=arr[i+1];
            list[a-'a'][b-'a']=true;
            if(list[b-'a'][a-'a']){
                return true;
            }
        }
        return false;
    }
}

3084. 统计以给定字符开头和结尾的子字符串总数

难度:1210

给你一个字符串 s 和一个字符 c 。返回在字符串 s 中并且以 c 字符开头和结尾的

非空子字符串

的总数。

示例 1:

输入:s = "abada", c = "a"

输出:6

解释:以 "a" 开头和结尾的子字符串有: "abada""abada""abada""abada""abada""abada"

示例 2:

输入:s = "zzz", c = "z"

输出:6

解释:字符串 s 中总共有 6 个子字符串,并且它们都以 "z" 开头和结尾。

提示:

  • 1 <= s.length <= 105
  • s 和 c 均由小写英文字母组成。

状态:完成

思路:数学问题,关键是找到字符串中有多少个字符c,算出c的阶乘。

class Solution {
    public long countSubstrings(String s, char c) {
        ArrayList<Character> list = new ArrayList();
        for(int i=0;i<s.length();i++){
            if(c==s.charAt(i)) list.add(s.charAt(i));
        }
        if(list.size()==0) return 0;
        long sum=0;
        for(int i=list.size();i>0;i--){
            sum+=i;
        }
        return sum;
        
    }
}

 3085. 成为 K 特殊字符串需要删除的最少字符数

难度:1773

给你一个字符串 word 和一个整数 k

如果 |freq(word[i]) - freq(word[j])| <= k 对于字符串中所有下标 i 和 j  都成立,则认为 word 是 k 特殊字符串

此处,freq(x) 表示字符 x 在 word 中的

出现频率

,而  |y| 表示  y 的绝对值。

返回使 word 成为 k 特殊字符串 需要删除的字符的最小数量。

示例 1:

输入:word = "aabcaba", k = 0

输出:3

解释:可以删除 2 个 "a" 和 1 个 "c" 使 word 成为 0 特殊字符串。word 变为 "baba",此时 freq('a') == freq('b') == 2

示例 2:

输入:word = "dabdcbdcdcd", k = 2

输出:2

解释:可以删除 1 个 "a" 和 1 个 "d" 使 word 成为 2 特殊字符串。word 变为 "bdcbdcdcd",此时 freq('b') == 2freq('c') == 3freq('d') == 4

示例 3:

输入:word = "aaabaaa", k = 2

输出:1

解释:可以删除 1 个 "b" 使 word 成为 2特殊字符串。因此,word 变为 "aaaaaa",此时每个字母的频率都是 6

提示:

  • 1 <= word.length <= 105
  • 0 <= k <= 105
  • word 仅由小写英文字母组成。

 状态:做不出来

思路:题目要求的是任意的下标之间两个字符出现的频率之差的绝对值是要小于k,那我们可以换个思路,把任意的字符作为出现频率最小的字符,然后把他之前的所有字符都去掉因为他是最小的,然后在把出现频率最高的字符都离这个最小的字符出现次数-k的次数加上去,然后不断对比各个最小的值需要移动的次数,找到最小的。

class Solution {
    public int minimumDeletions(String word, int k) {
        int[] arr =new int[26];
        for(int i=0;i<word.length();i++){
            arr[word.charAt(i)-'a']++;
        }
        Arrays.sort(arr);
        int min=Integer.MAX_VALUE;
        for(int i=0;i<26;i++){
            int temp=0;
            if(arr[i]==0) continue;
            //arr[i]作为最小出现次数的字母
            for(int j=i-1;j>=0;j--){
                if(arr[j]==0) break;
                temp+=arr[j];
            }
            for(int o=i+1;o<26;o++){
                temp+=Math.max(arr[o]-arr[i]-k,0);
            }
            min=Math.min(temp,min);
        }
        return min;
    }
}

感想:最后一题还没涉及,以后再考虑。 

  • 32
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值