题目的链接在这里:https://www.nowcoder.com/practice/0a8bbf8b9b5b4280957849ef4f240f07
题目大意
leafee 最近爱上了 abb 型语句,比如“叠词词”、“恶心心” leafee 拿到了一个只含有小写字母的字符串,她想知道有多少个 "abb" 型的子序列? 定义: abb 型字符串满足以下条件:字符串长度为 3 。
字符串后两位相同。
字符串前两位不同。
一、示意图
二、解题思路
动态规划 暴力匹配
动态规划 暴力匹配
代码如下:
import java.util.*;
public class Main{
public static void main(String[] args) {
/**
* abb型的词句
*/
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
//边界判断
if(n<3){
System.out.println(0);
return;
}
//用来消除的
sc.nextLine();
String s=sc.nextLine();
long sum=0;
long[]dp=new long[n];
int[]ch=new int[26];
for(char c:s.toCharArray()){
//记录每一个字符的数量
ch[c-'a']++;
}
//i从0到n-3
//这里选择i-2的原因在于 后面两个数 是不可能作为i为头的三位数的 因为他们都不能组成这三位数
//所有dp[i] 表示的是以 i对应位置的字符为开头的叠词的数量
for(int i=0;i<n-2;i++){
//这个位置对应的字符减去1
ch[s.charAt(i)-'a']--;
for(int j=0;j<26;j++){
if(s.charAt(i)-'a'!=j){
//说明不是对应的位置 那就是用这个数和其他位置的数进行匹配判断 判断的依据就是 如果这个数有两个的话 那就是匹配到1次 如果这个数有三个的话 那就是三选2 如果四次的话 就是4选2
// C(X,2) 而这个数和其他所有不相同的数遍历过一次之后 这个数就可以消失了
dp[i]+=(ch[j]*(ch[j]-1)/2);
}
}
}
//然后开始统计
for(int i=0;i<n-2;i++){
sum+=dp[i];
}
System.out.println(sum);
}
}