diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" index 174f55e848..15495a93ae 100644 --- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" +++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" @@ -239,6 +239,35 @@ function maxSubArray(nums: number[]): number { return resMax } ``` +### C: +```c +bool isSubsequence(char *s, char *t) +{ + bool **dp = malloc(sizeof(bool *) * (strlen(s) + 1)); + for (int i = 0; i <= strlen(s); i++) + { + dp[i] = malloc(sizeof(bool) * (strlen(t) + 1)); + } + // 初始化 + for (int i = 0; i <= strlen(s); i++) + { + dp[i][0] = false; + } + for (int j = 0; j <= strlen(t); j++) + { + dp[0][j] = true; + } + // 遍历 + for (int i = 1; i <= strlen(s); i++) + { + for (int j = 1; j <= strlen(t); j++) + { + dp[i][j] = s[i - 1] == t[j - 1] ? dp[i - 1][j - 1] : dp[i][j - 1]; + } + } + return dp[strlen(s)][strlen(t)]; +} +``` diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" index 1df3d899a8..97e8195262 100644 --- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" +++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" @@ -371,6 +371,45 @@ impl Solution { } } ``` +### C: +```c +#define MOD 1000000007 +int numDistinct(char *s, char *t) +{ + //dp[i][j]: t前i个字符,s前j个字符,s子序列中t出现的个数 + int **dp = malloc(sizeof(int *) * (strlen(t) + 1)); + for (int i = 0; i <= strlen(t); i++) + { + dp[i] = malloc(sizeof(int) * (strlen(s) + 1)); + } + + // 初始化 + for (int i = 0; i <= strlen(t); i++) + { + dp[i][0] = 0; + } + for (int j = 0; j <= strlen(s); j++) + { + dp[0][j] = 1; + } + // 遍历 + for (int i = 1; i <= strlen(t); i++) + { + for (int j = 1; j <= strlen(s); j++) + { + if (s[j - 1] == t[i - 1]) + { + dp[i][j] = dp[i - 1][j - 1] + dp[i][j - 1]; + } + else + { + dp[i][j] = dp[i][j - 1]; + } + } + } + return dp[strlen(t)][strlen(s)] % MOD; +} +``` diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" index 04845ea7c3..27285ba43a 100644 --- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" +++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" @@ -440,7 +440,7 @@ impl Solution { } ``` ### C - +- 按右边界排序 ```c // 按照区间右边界排序 int cmp(const void * var1, const void * var2){ @@ -465,6 +465,41 @@ int eraseOverlapIntervals(int** intervals, int intervalsSize, int* intervalsColS return intervalsSize - count; } ``` +- 按左边界排序 +```c +// 按照区间左边界排序 +int cmp(const void *a, const void *b) +{ + return *((int **)a)[0] - *((int **)b)[0]; +} +int eraseOverlapIntervals(int **intervals, int intervalsSize, int *intervalsColSize) +{ + if (intervalsSize == 0) + { + return 0; + } + qsort(intervals, intervalsSize, sizeof(intervals[0]), cmp); + // count: 重叠的区间数量 + int count = 0; + // end: 区间分割点 + int end = intervals[0][1]; + for (int i = 1; i < intervalsSize; i++) + { + if (intervals[i][0] < end) + { + // 说明有重合, end取2个区间中较小的右边界 + end = fmin(end, intervals[i][1]); + count++; + } + else + { + // 没有重合,更新end + end = intervals[i][1]; + } + } + return count; +} +```