算法日志 --- 11.25---情感丰富的文字

68 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

家人们,周五了,工作的事情就放一放了,下周再说

情感丰富的文字

该题出自力扣的809题 —— 情感丰富的文字【中等题】

审题

image.png

  • 该题的题意挺麻烦的,因为比较长,给出一个字符串作为标杆,再给出一个字符串数组作为对照参数,返回可以根据业务规则统计的最大数量
    • 所谓的业务规则就是字符串数组内的每个字符串,可以对其中的字符进行扩张,最终扩张的个数达到3个以上,那么就认为当前扩张成功,否则不算扩张,例如:“hello” → “hellllo” 即为可以扩张,少于3个包含自身在内的则不算扩张
  • 解法就很明朗了,遍历整个字符串数组进行比较是否能够扩张
    • 定义一个私有函数,作为判断的方法,传参就是两个字符串,一个是本身的参照字符串,一个是遍历的子变量
      • 利用双指针,同时指向两个字符串的首端,首先判断当前字符是否一致,如果不一致,那么就不需要进行后续的判断,直接剪枝
      • 利用遍历,分别获取两个字符串的相同字符数量,如果变量字符串的长度大于参照字符串,则直接返回false,因为数量就达不到要求
      • 如果数量不一致,并且参照字符串的长度小于3,即达不到业务规则,也是返回false

编码

class Solution {
    public int expressiveWords(String s, String[] words) {
        int num = 0;
        for (String word: words) {
            if (check(s,word))num++;
        }
        return num;
    }

    private boolean check(String s, String word) {
        int i = 0,j = 0;
        while (i<s.length() && j < word.length()){
            if (s.charAt(i) != word.charAt(j))return false;
            char c = s.charAt(i);
            int cnti = 0;
            while (i < s.length() && s.charAt(i) == c) {
                ++cnti;
                ++i;
            }
            int cntj = 0;
            while (j < word.length() && word.charAt(j) == c) {
                ++cntj;
                ++j;
            }
            if (cnti < cntj) {
                return false;
            }
            if (cnti != cntj && cnti < 3) {
                return false;
            }
        }
        return i == s.length() && j == word.length();
    }
}

image.png