第一题:6167. 检查相同字母间的距离
思路:用path来记录该字符是否遍历过,然后遍历,不满足条件返回false即可
class Solution {
public:
bool checkDistances(string s, vector<int>& distance) {
int n = s.size();
vector<int> path(n,1);
for(int i = 0; i < n; i++){
if(path[i]){
int j = i + 1;
while(s[j] != s[i]) j++;
path[j] = 0;
int tmp = j - i - 1;
int k = s[i] + '0' -145;
if(tmp != distance[k]) return false;
}
}
return true;
}
};
思路:这题感觉难度有点大,借鉴写法,数据范围不大,采取二维dp,一维表示步数,二维表示坐标,注意将答案取模,利用组合数的知识求解
class Solution {
public:
typedef long long LL;
const int mod = 1e9 + 7;
LL dp[1010][1010]; //一维表示步数,二维表示坐标
void init(){
for(int i = 0; i < 1010; i++){
for(int j = 0; j <= i; j++){
if(!j) dp[i][j] = 1;
else dp[i][j] = (dp[i-1][j-1] + dp[i-1][j]) % mod;
}
}
}
int numberOfWays(int startPos, int endPos, int k) {
init();
int tmp=k-(endPos-startPos);
int step=tmp/2+(endPos-startPos);
if(tmp&1) return 0;
if(step==k) return 1;
return dp[k][step];
}
};