#include "iostream"
using namespace std;
#include<cassert>
#include <string>
//找出两个字符串中最长的公共子串(如果存在多个 , 返回第一个)
//参数:str1 字符串1
// str2 字符串2
// maxSubStr 找到的最大子串
void findMaxSubstr(const char * str1, const char * str2, char * maxSubstr){
assert((str1 != NULL) && (str2 != NULL));
assert(maxSubstr != NULL);
int maxPos = -1;
int maxLen = 0,k;
for (int i = 0; i<strlen(str1); i++){
for (int j = 0; j<strlen(str2); j++){
if (str1[i] == str2[j]){
for (k = 1; (str1[i + k] == str2[j + k]) && (str1[i + k] != '\0'); k++);
if (k>maxLen){
maxPos = i;
maxLen = k;
}
}
}
}
if (maxPos == -1){
maxSubstr[0] = '\0';
}
else{
memcpy(maxSubstr, str1 + maxPos, maxLen);
maxSubstr[maxLen] = '\0';
}
}
//方法2
char* lcs(char *str1, char *str2)
{
int len1, len2;
int i, j;
char *shorter, *longer, *substr;
if (str1 == NULL || str2 == NULL)return NULL;
len1 = strlen(str1);
len2 = strlen(str2);
if (len1 < len2)
{
shorter = str1;
longer = str2;
}
else
{
shorter = str2;
longer = str1;
}
if (strstr(longer, shorter) != NULL) return shorter;
len1 = strlen(shorter);
substr = (char*)malloc(len1 + 1);
for (i = len1 - 1; i > 0; i--)
{
for (j = 0; j <= len1 - i; j++)
{
memcpy(substr, &shorter[j], i);
substr[i] = '\0';
if (strstr(longer, substr) != NULL) return substr;
}
}
return NULL;
}
//方法3
string lcs_search(string str1, string str2)//求两个字符串的公共子串
{
int len1 = str1.length();
int len2 = str2.length();
int length = 0;
int end = 0;
if (len1 < len2)
{
string temp = str1;
str1 = str2;
str2 = temp;
len1 = str1.length();
len2 = str2.length();
}
int *sign = new int[len1];
for (int i = 0; i < len2; i++)
{
for (int j = len1 - 1; j >= 0; j--)
{
if (str2[i] == str1[j])
{
if (i == 0 || j == 0)sign[j] = 1;
else sign[j] = sign[j - 1] + 1;
}
else sign[j] = 0;
if (sign[j] > length)
{
length = sign[j];
end = j;
}
}
}
delete[]sign;
return str1.substr(end - length + 1, length);
}
//方法4
string FindMAxSubString(string a, string b)
{
string res = "";
string shorter = a.length()>b.length() ? b : a;
string longer = a.length()>b.length() ? a : b;
int maxlen = 0;
int maxpos = -1;
for (int i = 0; i<shorter.length(); i++){
for (int j = 0; j<longer.length(); j++)
{
if (shorter[i] == longer[j])
{
int k = 1;
for (; (shorter[i + k] == longer[j + k]) && i + k<shorter.length(); k++);
if (k>maxlen){
maxpos = i;
maxlen = k;
}
}
}
}
if (maxpos == -1)
return res;
else
{
res = shorter.substr(maxpos, maxlen);
return res;
}
}
int main(){
char substr[20];
findMaxSubstr("zhangligu", "gligzhangligu", substr);
//cout << lcs("zhangligu", "gligzhangligu");
//cout << lcs_search("zhangligu", "gligzhangligu");
cout << FindMAxSubString("zhangligu", "gligzhangligu");
//cout << substr << endl;
return 0;
}
字符串逆序
char* str_reverse(char* str)
{
int n = strlen(str) / 2;
int i = 0;
char tmp = 0;
for (i = 0; i < n; i++)
{
tmp = str[i];
str[i] = str[strlen(str) - i - 1];
str[strlen(str) - i - 1] = tmp;
}
return str;
}