2017校园招聘编程题——两个字符串中找到最大公共字符串
2016-09-26 13:22
211 查看
1. 题目描述
输入两个字符串,从中找到它们最大的公共子字符串。输入描述:
输入为两行,每行字符串string长度在[1,100]之间。
输出描述:
输出公共子字符串。
输入例子:
abfeee
abefdfee
输出例子:
fee
2. 解题思路
匹配两个字符串(str1、str2)中最大公共子字符串(comStr),我们可以想象,最大匹配结果即较长字符串能够全匹配较短字符串,而最小匹配结果除了无一匹配情况,就只能匹配一个字符。这样想就简单许多,首先肯定需要比较字符串长度大小,找到较短字符串作为匹配参考,然后从较短字符串中截取一个字符,一直考虑到截取其全长度字符串,在较长字符串中寻找两者最大公共子字符串。思路总结如下:
Ⅰ输入字符串str1、str2;
Ⅱ比较出最短字符串(假设为str1,其长度为N),以str1作为匹配参考的字符串;
Ⅲ从str1中依次截取子字符串长度为len = 1:N
⑴ 开始len =1;
⑵ 每个截取长度为len的子字符串都在str2中查询,如有匹配赋给comStr;
⑶ len = len+1,重复查询,直到len=N结束;
Ⅳ 输出最终最长子公共字符串comStr。
例如:
较短字符串str1为abc:
len为1匹配字符串:a、b、c
len为2匹配字符串:ab、bc
len为3匹配字符串:abc、
依次在str2查询匹配结果。
3. 程序实现过程:
3.1 Java实现:
package ComString; import java.util.Scanner; public class SuitStringAB { public static void main(String[] args) { Scanner scan = new Scanner(System.in); String str_1 = scan.nextLine(); String str_2 = scan.nextLine(); System.out.println(commonString(str_1 ,str_2)); scan.close(); } public static String commonString(String str1 ,String str2) { String comString = ""; String childString = ""; String minString = str1.length() <= str2.length() ? str1 : str2; //寻找较短的字符串 for( int i=1;i<minString.length();i++)//遍历minString所有的匹配长度 for( int j=0; j<minString.length();j++)//遍历每个长度下的所有字符串 { if(j+i <= minString.length()) { childString = minString.substring(j, j+i); if(str2.indexOf(childString) != -1) comString = childString; } } return comString; } }
3.2 C/C++实现:
#include<iostream> #include<cstring> #include<algorithm> using namespace std; int main() { char str1[100],str2[100],comStr[100],tempStr[100]; cin >>str1>>str2; if(strlen(str2)>strlen(str1)) { swap(str1,str2);//比较字符串大小(algorithm头文件中),小的赋给str2 } comStr[0]=0; for(int i=0;i<strlen(str2);i++) for(int j=strlen(str2);j>i;j--) { memset(tempStr,0,sizeof(tempStr)); strncpy(tempStr,str2+i,j-i); if(strstr(str1,tempStr))//strstr 为库中匹配子字符串函数 { if(strlen(tempStr)>strlen(comStr))//当匹配到字符串tempStr,和之前comStr比较长度,长者替换短者 strcpy(comStr,tempStr); } } cout<<comStr<<endl; return 0; }
这种方式时间复杂度为O(N²),还有其他时间复杂度低的方法请参考网上其他博客,这里不再详细描述。
个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!
转载请注明出处:CSDN 无鞋童鞋。
相关文章推荐
- 阿里巴巴2014.08.29校园招聘笔试题---找出两个字符串中连续相同的最大子串
- 网易2017校园招聘编程题——暗黑字符串
- 华为2017校园招聘编程题——去除一段话字符串中重复单词
- 找到两个字符串的公共字符,并按照其中一个的排序
- 两个或N个字符串最大公共子串算法
- 求两个字符串的最大公共字串
- 求两个字符串的最大公共子串
- 求两个字符串最大的公共字串的长度
- 两个或N个字符串最大公共子串算法
- 求两个字符串的最大公共子串
- 两个或N个字符串最大公共子串算法
- C语言实现寻找两个字符串中的最大公共字符串长度
- 编程查找两个字符串最大公共子串
- 求两个字符串最大公共字符串(听说是微软几年前面试题)
- Exe 求两个字符串的最大公共字串
- 找出两个或者多个字符串中最大的公共串,最大的整数,最长的整数
- 求出两个字符串的最大公共字符串
- 所谓的两个字符串相等比较--校园招聘笔试题
- 找出两个字符串的最大公共子串
- 求两个字符串最大公共子串