题目描述 求一个字符串的最长递增子序列的长度 如:dabdbf 最长递增子序列就是 abdf,长度为 4 输入描述 第一行一个整数 0<n<20, 表示有 n 个字符串要处理 随后的 n 行,每行有一个字符串,该字符串的长度不会超过 10000 输出描述 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7
时间: 2024-01-17 09:03:00 浏览: 67
你可以按照上面的思路,对每个字符串分别求解最长递增子序列的长度。以下是示例代码:
```python
def longest_increasing_subsequence(s):
n = len(s)
dp = [1] * n
for i in range(1, n):
for j in range(i):
if s[j] < s[i]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
# 主函数
n = int(input())
for i in range(n):
s = input().strip()
print(longest_increasing_subsequence(s))
```
输入示例:
```
3
aaa
ababc
abklmncdefg
```
输出示例:
```
1
3
7
```
相关问题
求一个字符串的最长递增子序列的长度 如:dabdbf 最长递增子序列就是 abdf,长度为 4
这是一个经典的动态规划问题。可以使用一个一维数组dp来记录以每个字符结尾的最长递增子序列的长度。初始时,每个字符自成一个长度为1的递增子序列,即dp数组全为1。然后遍历字符串,对于每个字符,再遍历它前面的所有字符,如果比当前字符小,则可以将当前字符接到这个字符的子序列后面形成一个新的递增子序列,更新dp数组。最后dp数组中的最大值就是所求的最长递增子序列的长度。以下是示例代码:
```python
def longest_increasing_subsequence(s):
n = len(s)
dp = [1] * n
for i in range(1, n):
for j in range(i):
if s[j] < s[i]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
# 示例
s = 'dabdbf'
print(longest_increasing_subsequence(s)) # 输出 4
```
用C语言编写给你一个序列X和另一个序列Z,当Z中的所有元素都在X中存在,并且在X中的下标顺序是严格递增的,那么就把Z叫做X的子序列。 例如:Z=<a,b,f,c>是序列X=<a,b,c,f,b,c>的一个子序列,Z中的元素在X中的下标序列为<1,2,4,6>。 现给你两个序列X和Y,请问它们的最长公共子序列的长度是多少?输入包含多组测试数据。每组输入占一行,为两个字符串,由若干个空格分隔。每个字符串的长度不超过100。对于每组输入,输出两个字符串的最长公共子序列的长度。
以下是使用动态规划算法求解最长公共子序列的C语言代码:
```
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
int max(int a, int b) {
return (a > b) ? a : b;
}
int lcs(char *X, char *Y, int m, int n) {
int L[m + 1][n + 1];
int i, j;
for (i = 0; i <= m; i++) {
for (j = 0; j <= n; j++) {
if (i == 0 || j == 0) {
L[i][j] = 0;
} else if (X[i - 1] == Y[j - 1]) {
L[i][j] = L[i - 1][j - 1] + 1;
} else {
L[i][j] = max(L[i - 1][j], L[i][j - 1]);
}
}
}
return L[m][n];
}
int main() {
char X[MAX_LEN], Y[MAX_LEN];
while (scanf("%s%s", X, Y) == 2) {
int m = strlen(X);
int n = strlen(Y);
int len = lcs(X, Y, m, n);
printf("%d\n", len);
}
return 0;
}
```
在这个代码中,`lcs`函数用于计算两个字符串的最长公共子序列的长度。在主函数中,通过循环读入多组测试数据,并调用`lcs`函数求解最长公共子序列的长度,最后输出结果。
阅读全文