子串要求连续,子序列不要求连续。
子串的4种求法
// 方法一: 最容易想的解法,暴力可以使用,以i开头,向后枚举
for (int i = 0; i < n; i++) {
StringBuilder b = new StringBuilder();
for (int j = i; j < n; j++) {
b.append(s.charAt(i)); // 每一个j都是一个子串
}
}
// 方法二:最模拟的想法,按照长度划分子串
for (int i = 0; i < n; i++) {
StringBuilder sb = new StringBuilder();
for (int len = 1; len + i - 1 < n; len++) {
int j = i + len - 1;
b.append(s.charAt(j));
}
}
// 方法三:方法一的逆序构造
for (int i = n - 1; i >= 0; i--) {
StringBuilder sb = new StringBuilder();
for (int j = i; j < n; j++) {
sb.append(s.charAt(j));
}
}
// 方法四:这是一种错误的解法,因为求的字符子串都是重复的。
for (int i = 0; i < n; i++) {
String s;
for (int j = 0; j <= i; j++) {
s += s.charAt(j);
}
}
// 方法5:以i结尾的子串,这种最容易使用dp
for (int i = 0; i < n; i++) {
String ss;
for (int j = i; j >= 0; j--) {
ss = s.charAt(j) + ss; // 把这个字符插入到字符的前面。
}
}
子序列的三种求法
- 懒得写了
- 子集枚举的三种方式
- 最常用的就是这种二进制法了
void print_subset10(int *A, int N, int seq) {
for(int i=0; i<N; i++) {
if( seq & (1<<i) ) {
printf("%5d", A[i]);
}
}
printf("\n");
}
int main() {
int Length = 3;
int A[Length] = {1, 3, 2};
printf("Method10:\n");
for(int i=0; i<(1<<Length); i++) {
print_subset10(A, Length, i);
}
printf("\n");
return 0;
}