栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

算法刷题集训第二天--字符串

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

算法刷题集训第二天--字符串

个人简介

⭐️个人主页:摸鱼の文酱博客主页‍♂️
博客领域:java编程基础,mysql
写作风格:干货,干货,还是tmd的干货
精选专栏:【Java】【mysql】 【算法刷题笔记】
博主的码云gitee,平常博主写的程序代码都在里面。
支持博主:点赞、收藏⭐、留言
作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!

文章目录
  • 今日学习内容:字符串
  • 2278. 字母在字符串中的百分比
    • 解题思路
      • 思路一:枚举
  • 551. 学生出勤记录 I
    • 解题思路
      • 思路一:遍历
  • 2255. 统计是给定字符串前缀的字符串数目
    • 解题思路
      • 思路一:遍历+库函数
  • 1071. 字符串的最大公因子
    • 解题思路
      • 思路一:辗转相除法
      • 思路二:枚举法

今日学习内容:字符串
题目链接难度
2278. 字母在字符串中的百分比easy
551. 学生出勤记录 Ieasy
2255. 统计是给定字符串前缀的字符串数目easy
1071. 字符串的最大公因子easy
2278. 字母在字符串中的百分比 解题思路 思路一:枚举

  1.思路一:将字符串中的每一个字符依次取出与给定字符比较,一样就计数器加一,最后除以字符串长度得出数字

 public int percentageLetter(String s, char letter) 
    {
        int n = s.length();

        int cnt = 0;
        for (int i = 0; i < s.length(); i ++)
        {
            if (s.charAt(i) == letter)
            {
                cnt ++;
            }
        }

        int res = (int)((double)cnt / n * 100);
        return res;
    }
551. 学生出勤记录 I 解题思路 思路一:遍历

  1.思路一:将记录依次取出 记录A的数量,大于或等于两个false 判断连续L的数量,达到三个连续的false
其余情况true

class Solution {
    public boolean checkRecord(String s) {
        int n = s.length();
        char[] cs = s.toCharArray();
        for (int i = 0, cnt = 0; i < n; ) {
            char c = cs[i];
            if (c == 'A') {
                cnt++;
                if (cnt >= 2) return false;
            } else if (c == 'L') {
                int j = i;
                while (j < n && cs[j] == 'L') j++;
                int len = j - i;
                if (len >= 3) return false;
                i = j;
                continue;
            }
            i++;
        }
        return true;
    }
}

2255. 统计是给定字符串前缀的字符串数目 解题思路 思路一:遍历+库函数
class Solution {
    public int countPrefixes(String[] words, String s) {
         int cnt = 0;
        for (String w : words)
             if (s.startsWith(w)) cnt++;
        return cnt;

    }
}
1071. 字符串的最大公因子 解题思路 思路一:辗转相除法

  1.思路一:由题意得知,需要在字符串str1和字符串str2中找寻一个最大的字符串X,使得X可以同时除尽字符串str1和字符串str2。
你品,你细品,“除尽”是不是意味着——字符串str1和str2内只存在一或多个的字符X。
即,字符串str1可由x个字符串X拼接而成,字符串str2可由y个字符串X构成,x、y皆大于等于1。
可得公式,str1 + str2 = (x + y)X。那么同理,str2 + str1 = (y + x)X。
所以只要满足str1 + str2 == str2 + str1,说明了在字符串str1和str2内必存在字符串X。

private int gcd(int a,int b){ //最大公约数
        return b==0?a:gcd(b,a%b);
    }

    public String gcdOfStrings2(String str1, String str2) {
        // 假设str1是N个x,str2是M个x,那么str1+str2肯定是等于str2+str1的。
        if (!(str1 + str2).equals(str2 + str1)) {
            return "";
        }
        // 辗转相除法求gcd。
        return str1.substring(0, gcd(str1.length(), str2.length()));
    }
思路二:枚举法

  1.思路一:首先答案肯定是字符串的某个前缀,然后简单直观的想法就是枚举所有的前缀来判断,我们设这个前缀串长度为

所以我们可以枚举符合长度条件的前缀串,再去判断这个前缀串拼接若干次以后是否等于 str1 和 str2 即可。
由于题目要求最长的符合要求的字符串 X,所以可以按长度从大到小枚举前缀串,这样碰到第一个满足条件的前缀串返回即可。

class Solution {
    public String gcdOfStrings(String str1, String str2) {
        int len1 = str1.length(), len2 = str2.length();
        for (int i = Math.min(len1, len2); i >= 1; --i) { // 从长度大的开始枚举
            if (len1 % i == 0 && len2 % i == 0) {
                String X = str1.substring(0, i);
                if (check(X, str1) && check(X, str2)) {
                    return X;
                }
            }
        }
        return "";
    }

    public boolean check(String t, String s) {
        int lenx = s.length() / t.length();
        StringBuffer ans = new StringBuffer();
        for (int i = 1; i <= lenx; ++i) {
            ans.append(t);
        }
        return ans.toString().equals(s);
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/953053.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号