C语言给定两个字符串s和t判断s是否是t的子序列
时间: 2023-05-31 15:05:18 浏览: 123
思路:
- 定义两个指针i和j,分别指向s和t的开头。
- 遍历t,如果当前字符等于s的字符,则i和j同时后移;否则只将j后移。
- 如果i指针到达了s的末尾,则s是t的子序列;否则如果j指针到达了t的末尾,则s不是t的子序列。
代码实现:
```c
bool isSubsequence(char * s, char * t){
int i = 0, j = 0;
while (s[i] && t[j]) {
if (s[i] == t[j]) {
i++;
j++;
} else {
j++;
}
}
return !s[i];
}
```
时间复杂度:$O(n)$,其中$n$为$t$的长度。
相关问题
请用C语言动态规划法写出该题:给定两个字符串A,B,长度分别为m和n,要求找出他们最长的公共子序列,并返回其长度。
好的,下面是用 C 语言动态规划法实现查找两个字符串最长公共子序列的代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
int lcs(char* str1, char* str2, int m, int n)
{
int dp[MAX_LEN][MAX_LEN];
int i, j;
// 初始化 dp 数组
for (i = 0; i <= m; i++) {
for (j = 0; j <= n; j++) {
if (i == 0 || j == 0) {
dp[i][j] = 0;
} else if (str1[i-1] == str2[j-1]) {
dp[i][j] = dp[i-1][j-1] + 1;
} else {
dp[i][j] = (dp[i-1][j] > dp[i][j-1]) ? dp[i-1][j] : dp[i][j-1];
}
}
}
return dp[m][n];
}
int main()
{
char str1[MAX_LEN], str2[MAX_LEN];
int len1, len2;
printf("请输入字符串 A 和字符串 B:\n");
scanf("%s %s", str1, str2);
len1 = strlen(str1);
len2 = strlen(str2);
int res = lcs(str1, str2, len1, len2);
printf("最长公共子序列的长度为 %d\n", res);
return 0;
}
```
在上述代码中,我们定义了一个二维数组 dp 来记录状态转移过程,其中 dp[i][j] 表示字符串 A 的前 i 个字符和字符串 B 的前 j 个字符的最长公共子序列长度。然后,我们使用双重循环来遍历字符串 A 和字符串 B,根据状态转移方程来更新 dp 数组。最终,dp[m][n] 中记录的就是字符串 A 和字符串 B 的最长公共子序列的长度。
希望这个代码能够帮助到你!
c语言最长公共子序列问题
最长公共子序列问题是指给定两个序列,求它们的最长公共子序列的长度。下面是C语言实现最长公共子序列问题的代码:
```c
#include <stdio.h>
#include <string.h>
#define MAXLEN 100
int max(int a, int b) {
return a > b ? a : b;
}
int lcs(char *s1, char *s2, int len1, int len2) {
int dp[MAXLEN][MAXLEN];
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (s1[i - 1] == s2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return dp[len1][len2];
}
int main() {
char s1[MAXLEN], s2[MAXLEN];
printf("请输入两个字符串:\n");
scanf("%s%s", s1, s2);
int len1 = strlen(s1), len2 = strlen(s2);
int ans = lcs(s1, s2, len1, len2);
printf("最长公共子序列的长度为:%d\n", ans);
return 0;
}
```