1.c语言回文子串的判定(递归算法)。
虽然迭代写起来更加简单,但是递归看起来更加精妙。建立一个judge函数,返回字符串s的 i 到 j 的子串是否为回文序列。
正确代码:
int judge(char* s, int i, int j) {
if (i == j) {
return 1;
}
if (i < j) {
if (s[i] == s[j]) {
return judge(s, i + 1, j - 1);
} else
return 0;
}
return 1;
}
错误代码:
int judge(char* s, int i, int j) {
if (i == j) {
return 1;
}
if (i < j) {
if (s[i] == s[j]) {
continue;
} else
return 0;
}
return judge(s,i+1,j-1);
}
此时我认为,若s[i]==s[j]时不用管,直接return judge(s,i+1,j-1)。但实际此时递归结束后没有返回值。
需要保证函数中的各类返回值是完备的。
2.输出子串。
若我需要返回字符串s第i到第j位的子串:
char *s="abcdefg";
int i=2;
int j=4;
s[j+1]='\0';
char *ss=s+2;
ss即为所求。
3.题目代码。
int judge(char* s, int i, int j) {//回文序列的判定
if (i == j) {
return 1;
}
if (i < j) {
if (s[i] == s[j]) {
continue;
} else
return 0;
}
return judge(s,i+1,j-1);
}
char* longestPalindrome(char* s) { //暴力遍历
int n = strlen(s);
int i = 0, j;
int x = 0, max = 0;
int ii, jj;
for (i; i < n; i++) {
for (j = n - 1; j >= i; j--) {
if (judge(s, i, j)) {
x = j - i + 1;
if (x > max) {
ii = i;
jj = j;
max = x;
}
}
}
}
s[jj + 1] = '\0';
char* ss = s + ii;
return ss;
}
4.中心扩散
5.动态规划
有时间再看