黑马程序员技术交流社区
标题:
分享下"找出多个字符串中的最大公共子字符串"的一种写法
[打印本页]
作者:
wslinke
时间:
2015-4-17 14:14
标题:
分享下"找出多个字符串中的最大公共子字符串"的一种写法
//
// main.m
// 测试题10
//
// Created by 林柯 on 15/4/16.
// Copyright (c) 2015年 itcast. All rights reserved.
//
/*
10、 找出多个字符串中的最大公共子字符串,如“nbitheimanb”和“itheia”的最大子串是:”ithei”。(C语言)
设计思路:
先判断哪个字符串的字符长度较短,假设为str1,在该字符串上建立循环,从第一个字符(i=0)开始
该字符在另一个字符串(假设为str2)中第一次出现的位置,若没有找到,则跳到str1的第二个字符(i=1)开始
若找到,则定位str2中该字符的位置(str2+j),开始依次判断接下来的字符是否相等,若相等将length的值+1
直到不相等为止,将最终的length与maxLength相比,若length>maxLength,maxLength=length;并储存字符字串
接着继续从str2+j开始继续查找是否有与str+i相同的字符……直到字符串末尾
接着将i的值+1,继续上述步骤;最后输出储存的字符串
获取三个字符串的最大公共字串
设计思路:
和设计获取两个字符串的最大公共字串的流程大致一样
从最短的字符串开始开始进行循环,但在第二个字符串中找到相同字符时不直接进行length的计算,
而是开始在第三个字符串中进行检索,找到相同字符再进行length的计算
以此类推可以写出N个字符串中的最大公共字串
*/
#include <stdio.h>
#include <string.h>
/**
* 查找两个字符串中的最大字串
*
* @param sameStr 用来储存最大字串的字符数组的指针地址
* @param str1 用来比较的字符串1
* @param str2 用来比较的字符串2
*/
void findSameInTwoStr(char *sameStr,char *str1,char *str2);
/**
* 查找三个字符串中的最大字串
*
* @param sameStr 用来储存最大字串的字符数组的指针地址
* @param str1 用来比较的字符串1
* @param str2 用来比较的字符串2
* @param str3 用来比较的字符串3
*/
void findSameInThreeStr(char *sameStr,char *str1,char *str2,char *str3);
int main(void)
{
//定义用来测试的字符串
char *str1 = "nbitheimanb";
char *str2 = "itheianb";
char *str3 = "foianb";
//定义一个字符数组,存储两个字符串中的最大字串
char sameStr[80];
findSameInTwoStr(sameStr,str1, str2);
//定义一个字符数组,存储三个字符串中的最大字串
char sameStr2[80];
findSameInThreeStr(sameStr2, str1, str2, str3);
//打印测试结果
printf("%s\n%s\n",sameStr,sameStr2);
return 0;
}
void findSameInThreeStr(char *sameStr,char *str1,char *str2,char *str3)
{
/*利用字符指针数组将str1,str2,str3的指针
以其所指向字符串长度从小到大重新分配给str1,str2,str3*/
char *str[3] = {str1,str2,str3};
for (int i = 0; i < 2; i++) {
for (int j = i+1; j < 3; j++) {
if (strlen(str[i]) > strlen(str[j])) {
char *temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
}
str1 = str[0];
str2 = str[1];
str3 = str[2];
//定义int型变量,用来储存字串长度,最长字串长度
int length = 0,maxLength = 0;
//从str1中第一个字符开始,寻找str2中该字符的位置
for (int i = 0;i < strlen(str1);i++) {
for (int j = 0; j < strlen(str2); j++) {
//如果找到相同的字符,则在str3中寻找该字符
if (*(str1+i) == *(str2+j)){
for (int k = 0; k < strlen(str3); k++) {
//如果在三个字符串中都找到该字符,则开始计算相同字串长度
if (*(str1+i) == *(str2+j) && *(str1+i) == *(str3+k)) {
length = 0;
while (*(str1+i+length) == *(str2+j+length) && *(str1+i+length) == *(str3+k+length)) {
length++;
}
}
//若字串长度大于历史最长长度,则覆盖历史最长长度,并储存字符字串
if (length>maxLength) {
maxLength = length;
for (int count = 0; count < length; count++) {
*(sameStr+count) = *(str1+i+count);
}
}
}
}
}
}
}
void findSameInTwoStr(char *sameStr,char *str1,char *str2)
{
//获取str1指针指向最短的字符串,str2指向较长的字符串
if (strlen(str1) > strlen(str2)) {
char *temp = str1;
str1 = str2;
str2 = temp;
}
//定义int型变量,用来储存字串长度,最长字串长度
int length = 0,maxLength = 0;
/*取出str1+i对应的字符,在str2中寻找,若找到,其地址为str2+j
此时将使用一个while循环求出该字串的长度,之后将该长度与历史最长长度对比
若该长度较长,覆盖历史最长长度,保存该字符串,再进行下一次检索
直到str1的字符都取完为止*/
for (int i = 0; i < strlen(str1); i++) {
for (int j = 0; j < strlen(str2); j++) {
if (*(str1+i) == *(str2+j)) {
length = 0;
while (*(str1+i+length) == *(str2+j+length)) {
length++;
}
}
if (length>maxLength) {
maxLength = length;
for (int count = 0; count < length; count++) {
*(sameStr+count) = *(str1+i+count);
}
}
}
}
}
复制代码
作者:
wslinke
时间:
2015-4-17 14:15
代码有点略长,希望有兴趣的朋友可以耐心看看
给我一些建议,大家共同进步
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2