7月算法训练------第二天(字符串)解题报告

7月算法训练------第二天(字符串)解题报告

题目类型:字符串
题目难度:简单

第一题、2315. 统计星号

题目链接:2315. 统计星号
思路分析:
用一个字符数组存储字符串s,定义一个布尔变量flag,主要用于判断当前字符是否在两个|之间。如果在两者之间则不计数,如果不在两个|之间,若满足c[i]==*,则使sum++
返回最终的sum

代码:

class Solution {
    public int countAsterisks(String s) {
        char[] c = new char[s.length()];
        for(int i = 0; i < c.length; i++){
            c[i] = s.charAt(i);
        }
        boolean flag = false;
        int sum = 0;
        for(int i = 0; i < c.length; i++){
            if(c[i] == '|' && !flag){ //第一个|出现,将flag至true
                flag = true;
            }else{
                if(c[i] == '|' && flag){ //成对的|出现,将flag置false;
                    flag = false;
                }
            }
            if(!flag){
                if(c[i] == '*'){
                    sum++;
                }
            }
        }
        return sum;
    }
}

第二题、459. 重复的子字符串

题目链接:459. 重复的子字符串
思路分析:
运用Java自身的字符串匹配算法
代码:

class Solution {
    public boolean repeatedSubstringPattern(String s) {
        return (s + s).indexOf(s, 1) != s.length();
    }
}

第三题、1790. 仅执行一次字符串交换能否使两个字符串相等

题目链接:1790. 仅执行一次字符串交换能否使两个字符串相等
思路分析:

第一版:

遍历两个字符串,如果字符串中有两个字符不相同,就返回true
如果不是两个字符不同,就返回false
错误:两个字符串相等时也要返回true

第二版:

当两个字符串完全相等时,也要返回true(即两个字符串中的不相同字符为0个);
错误原因:

"caa"
"aaz"
预期结果:false;
返回结果:true;
第三版:

在判断有两个字符不相等时,同时要判断这两个字符交换后是否相同,这时就需要有两个变量,记录不相同字符的索引:firstsecond
当有两个字符不相等时如果c1[first] == c2[second] && c2[first] == c1[second]那么就返回true

代码:

class Solution {
    public boolean areAlmostEqual(String s1, String s2) {
        int count = 0, first = 0, second = 0;
        char[] c1 = new char[s1.length()];
        char[] c2 = new char[s2.length()];
        for(int i = 0; i < c1.length; i++){
            c1[i] = s1.charAt(i);
            c2[i] = s2.charAt(i);
        }
        for(int i = 0; i < c1.length; i++){
            if(c1[i] != c2[i] && first == 0){
                count++;
                first = i;
            }else if(c1[i] != c2[i] && first != 0){
                count++;
                second = i;
            }
        }
        if(count == 2 || count == 0){
            if(c1[first] == c2[second] && c2[first] == c1[second]){
                return true;
            }
        }
        return false;
    }
}

第四题、1961. 检查字符串是否为数组前缀

题目链接:1961. 检查字符串是否为数组前缀
思路分析:
用一个StringBuilder存储words中的字符串,如果StringBuilder的长度小于s的长度,则继续向StringBuilder加入字符串;当存储到StringBuilder的长度和s的长度相等时,就结束存储;

然后判断一下StringBuilder的长度和s的长度是否相等,这一步的目的是为了防止出现words中的字符串全都存储在StringBuilder中,即StringBuilder.length() > s.length()

最后按顺序遍历StringBuilders,如果有不同,则返回false;如果都相同则返回true
代码:

class Solution {
    public boolean isPrefixString(String s, String[] words) {
        StringBuilder strb = new StringBuilder();
        for(int i = 0; i < words.length; i++){
            if(strb.length() < s.length()){
                strb.append(words[i]);
            }
            if(strb.length() == s.length()){
                break;
            }
        }
        if(s.length() != strb.length()){
                return false;
        }
        for(int i = 0; i < s.length(); i++){
            
            if(s.charAt(i) != strb.charAt(i)){
                return false;
            }
        }
        return true;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值