(nice!!!) (LeetCode 每日一题) 3333. 找到初始输入字符串 II (贪心+动态规划dp+前缀和)
题目:3333. 找到初始输入字符串 II
思路:参考大神的思路
C++版本:
class Solution {
public:const int mod=1e9+7;int possibleStringCount(string word, int k) {int n=word.size();if(n<k) return 0;vector<int> v;int ct=0;long long sum=1;for(int i=0;i<n;i++){ct++;if(i==n-1 || word[i]!=word[i+1]){if(ct>1){v.push_back(ct-1);sum=sum*ct%mod;}k--;ct=0;}}if(k<=0) return (int)sum;int m=v.size();vector<vector<int>> f(m+1,vector<int>(k+1));vector<int> s(k+1);ranges::fill(f[0],1);for(int i=0;i<m;i++){for(int j=0;j<k;j++){s[j+1]=(s[j]+f[i][j])%mod;}for(int j=0;j<k;j++){f[i+1][j]=(s[j+1]-s[max(j-v[i],0)])%mod;}}return (sum-f[m][k-1]+mod)%mod;}
};
JAVA版本:
class Solution {public int possibleStringCount(String word, int k) {final int mod=1000000007;int n=word.length();if(n<k) return 0;List<Integer> v=new ArrayList<>();long sum=1;int ct=0;for(int i=0;i<n;i++){ct++;if(i==n-1 || word.charAt(i)!=word.charAt(i+1)){if(ct>1){v.add(ct-1);sum=(sum*ct)%mod;}k--;ct=0;}}if(k<=0) return (int)sum;int m=v.size();int[][] f=new int[m+1][k];int[] s=new int[k+1];Arrays.fill(f[0],1);for(int i=0;i<m;i++){for(int j=0;j<k;j++){s[j+1]=(s[j]+f[i][j])%mod;}for(int j=0;j<k;j++){f[i+1][j]=(s[j+1]-s[Math.max(0,j-v.get(i))])%mod;}}return (int)((sum-f[m][k-1]+mod)%mod);}
}
Go版本:
func possibleStringCount(word string, k int) int {const mod int =1000000007n:=len(word)if n<k {return 0}v:=make([]int,0)ct:=0sum:=1for i:=0;i<n;i++ {ct++if i==n-1 || word[i]!=word[i+1] {if ct>1 {v=append(v,ct-1)sum=(sum*ct)%mod}k--ct=0}}if k<=0 {return sum}m:=len(v)f:=make([][]int, m+1)for i:=range f {f[i]=make([]int,k)}for i:=range f[0] {f[0][i]=1}s:=make([]int,k+1)for i:=0;i<m;i++ {for j:=0;j<k;j++ {s[j+1]=(s[j]+f[i][j])%mod}for j:=0;j<k;j++ {f[i+1][j]=(s[j+1]-s[max(0,j-v[i])])%mod}}return (sum-f[m][k-1]+mod)%mod
}