https://leetcode.cn/problems/count-number-of-texts/description/
思路
这道题,观察就会发现,我们只需要看连续一样的子串,然后看他能够形成多少个组合,然后每个这样的子串相乘就能得到结果。如何对子串进行求出组合的结果呢,这就和爬楼梯一样,遍历每一个点,看能够到达这个点的方式有多少,不断的往后递推,就能得到答案。
class Solution {
public:
unordered_map<char,int> maps={
{'2',3},{'3',3},{'4',3},
{'5',3},{'6',3},{'7',4},
{'8',3},{'9',4}
};
int countTexts(string pressedKeys) {
// 连续的进行相乘结果
unsigned long long res = 1;
int left = 0;
int right = 0;
const int MOD = 1000000007;
cout<<MOD<<endl;
while(right<pressedKeys.size()){
left = right;
right = right+1;
while(right<pressedKeys.size() and pressedKeys[left]==pressedKeys[right]){
right++;
}
res*=acumulates(pressedKeys[left], right-left);
res%=MOD;
}
return res;
}
unsigned long long acumulates(char temp, int size){
int n = size;
int m = maps[temp];
vector<unsigned long long> dp(n+1,0);
dp[0] = 1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i>=j)dp[i] +=dp[i-j];
dp[i]%=1000000007;
}
}
return dp[n];
}
};