开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
家人们,周五了,工作的事情就放一放了,下周再说
情感丰富的文字
该题出自力扣的809题 —— 情感丰富的文字【中等题】
审题
- 该题的题意挺麻烦的,因为比较长,给出一个字符串作为标杆,再给出一个字符串数组作为对照参数,返回可以根据业务规则统计的最大数量
- 所谓的业务规则就是字符串数组内的每个字符串,可以对其中的字符进行扩张,最终扩张的个数达到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();
}
}