[algorithm] 字符串判断包含关系和合并序列
依然是德问上的一个问题:
首先两个字符串string1="ab"和字符串string2="c",他们的合并关系指输出所有的组合,这个例子应该输出:abc,acb,cab(每一个字符串的元素相对位置不变)。
给定了一个字符串string3="abc",怎么按照上面说的合并规则确定string3是不是string1和string2的一个合并关系呢?
问题分析:
假设两个字符串分别是string1和string2,长度分别是M和N, 合并得到的字符串为string3;
1:问题中要求每一个字符串的元素相对位置不变,那么string3的首字符要么是string1[0]要么是string2[0];
那么string3字符串的规律就是这样的:
string1[0] + (string1[1…M-1]和string2[0…N-1]字符串合并)
string2[0] + (string1[0…M-1]和string2[1…N-1]字符串合并)
2:1中描述的蓝色部分仍然可以看做此问题,第一个字符串的第一个字符+…..,和第二个字符串的第一个字符+…; 这样问题就转化为一个递归问题了。
3:第二个问题,给定str1,str2,str3,由于字符串中的字符相对位置确定,三个指针顺序遍历,如果str3中的当前字符是str1中字符,则++str3,++str1,如果是str2中的字符串,则++str2,++str3,如果有不相等或者遍历后str1,str2仍有字符则false.
#include <iostream>#include <stdio.h>
#include <stdlib.h>
#include <string.h>
namespace X{
void out(const char *str1, const char *str2, char *str3, int m, int n, int index)
{
if (!m && !n)
std::cout<<str3<<std::endl;
if (m) {
str3[index] = str1[0];
out(str1+1, str2, str3, m-1, n,index+1);
}
if (n) {
str3[index] = str2[0];
out(str1,str2+1, str3, m, n-1, index+1);
}
}
bool isstringsum (const char *str1, const char *str2, const char *str3) {
while (*str3) {
if(*str1==*str3) ++str1;
else if(*str2==*str3) ++str2;
else return false;
++str3;
}
if(*str1||*str2)
return false;
return true;
}
}
int main()
{
char *str1 = " ab ";
char *str2 = " c ";
int m = strlen(str1);
int n = strlen(str2);
char *strout= (char*) malloc((m+n+1)*sizeof(char));
strout[m+n] = ' \0 ';
std::cout<<" result: "<<std::endl;
X::out (str1, str2, strout, m,n, 0);
char *str3 = " cab ";
X::isstringsum(str1,str2,str3)?std::cout<<" ok "<<std::endl:std::cout<<" error "<<std::endl;
free(strout);
return 0;
}