브 루트 포스 알고리즘을 사용하여 POJ 3080 && ZOJ2784 솔루션

주제 :

여기에 인용 한 것입니다

샘플 입력 :

3
2
GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
3
GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA
GATACTAGATACTAGATACTAGATACTAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA
GATACCAGATACCAGATACCAGATACCAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA
3
CATCATCATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
ACATCATCATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACATCATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

샘플 출력 :

no significant commonalities
AGATAC
CATCATCAT

아마 질문의 의미

캐릭터가 큰 경우가 또는 공통 출력 동일보다 덜 3m 열 출력보다 크게 공통점 경우 N 입력 그룹은, 상기 문자열의 m 각각 최대 문자열 공개 문자열 m, 최대의 공통 부분을 찾을 문자열이 문자열 인 경우, 복수의 동일한 최소 갔다.

브 루트 포스 아이디어와 알고리즘 :

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n,m;//输入n组测试 ,每组有m个需要区陪的字符串 
	char str[11][61],x[61],y[61];//str[11][61]是输入的字符串存储数组,x[61] y[62],一个是查找符合条件的字符串数组,一个是最终储存最长的字符串的数组 
	int res_len,str_len,temp,i,j,k,t;//res_len是最终有共同字符串的长度,str_len是字符串的长度 
	cin>>n;
	while(n--) {
		res_len=0;//一开始字符串的长度 
		cin>>m;
		for(int i=0; i<m; i++) cin>>str[i];//开始存字符串 
		str_len=strlen(str[0]);//记下字符串的长度 
		for( i=1; i<=str_len; i++) {//i是当前要匹配的字符串长度 
			for( j=0; j+i-1<str_len; j++) {  //这里的j是一直在变化的,影响着查找的位数。 
				for( k=0; k<i; k++) {//j就是从第一位开始一位一位往后面查询 
					x[k]=str[0][j+k];//这个str[0][j+k]可以这样理解,从j位开始一直往后面找,一直找到i个长度的字符串 
				}
				x[k]='\0';//把最后一个k标记成空,以免乱码 
				for( k=0; k<m; k++) {//在这m个字符串中 查找一下是否有相同的字符串。 
					if(strstr(str[k],x)==NULL) break;
				}
				if(k>=m) {//如果k>=m说明现在的这个相同字符串不小于上一个字符串 
					temp=strlen(x);//temp临时字符串长度 ,就是当前这个字符串 
					if(temp==res_len) {//res_len是上次相同字符串的长度 
						for( t=0; t<res_len; t++) {
							if(y[t]>x[t]) {//如果相等的话就找最小的 
								for( t=0; t<=res_len; t++) y[t]=x[t];
								break;
							}
						}
					}
					if(temp>res_len) {//如果大于的话就开始更换 
						res_len=temp;
						for( t=0; t<=res_len; t++) y[t]=x[t];
					}
				}
			}
		}
		if(res_len>=3) cout<<y<<endl;
		else cout<<"no significant commonalities"<<endl;
	}
	return 0;
}

특별 참고 사항 :

I-1 + J의 코드, 왜 쓰기?

사실, 이것은이다 때문에 단일 문자 이송 60 회 수행하고, 1,하지만 또는 문자열의 복수로 구성되어, 2와 동일보다 큰 경우에, I-1 CI + J 할 변수 I에 라인에. 예를 들면,이 문자열에서 문자가 ABCD 순회 IS A-> B-> C-> D 4 회 수행. 두 문자가 AB-> BC->가되었다 그러나, CD는 세 번 정도됩니다 횡단 않습니다.

출시 팔 개 원래 기사 · 원 찬양 8 · 전망 (203)

추천

출처blog.csdn.net/xzy15703841578/article/details/105311230