zoukankan      html  css  js  c++  java
  • 39-字符循环节

    题目内容:

     馅饼同学是一个在百度工作,做用户请求(query)分析的同学,他在用户请求中经常会遇到
     一些很奇葩的词汇。在比方说“johnsonjohnson”、“duckduck”,这些词汇虽然看起来是一
     些词汇的单纯重复,但是往往都是一些特殊品牌的词汇,不能被拆分开。为了侦测出这种词的
     存在,你今天需要完成我给出的这个任务——“找出用户请求中循环节最多的子串”。

    输入数据包括多组,每组为一个全部由小写字母组成的不含空格的用户请求(字符串),占一行。
    用户请求的长度不大于100,000。

    输出描述

    对于每组输入,输出这组用户请求中循环节最多的子串。如果一个用户请求中有两个循环节数相同的
    子串,请选择那个字典序最小的。

    输入样例

    duckduckgo

    输出样例

    duckduck
    */
    //思路:通过每个字母去匹配后面的每个字母,若相同则判断这两个子母间是否是循环节,即从i到j-1是否和j到j + j - i相同,
    //若相同则是循环节,则在d[i][j]填为1;如果有连续的循环出现则按长度推算d[i+(j-i)][j+(j-i)]也应该为1,可手绘图找规律

    #include <iostream>
    #include <cstring>
    using namespace std;
    string str, mu;
    string maxstr;
    int d[100][100];
    
    int isxun(int i, int j){  //判断是否是循环 
    	for(int k = i + 1, l = j + 1; k < j; k++, l++){
    		if(str[k] != str[l]){
    			return 0;
    		}
    	}
    	return 1;
    }
    
    int fun(string str){  
    	int i, j = 0, flag = 0;
    	for(int i = 0; i < str.length(); i++){
    		for(int j = i + 1; j < str.length(); j++){  //暴力找循环节 
    			if(str[i] != str[j]){
    				continue;
    			}
    			if(isxun(i, j)){
    				d[i][j] = 1;	
    			}
    		}
    	}
    }
    
    string find(int i, int j){   //将(i,j)转化为字符串 
    	string ss;
    	for(int k = i; k < j; k++)
    		ss += str[k];
    	return ss;
    }
    
    int main(){
    	int count = 0, max1 = 0, sum = 0;
    	cin >> str;
    	fun(str);
    	for(int i = 0; i < str.length(); i++){
    		for(int j = 0; j < str.length(); j++){
    //			cout << d[i][j] << " ";
    			if(d[i][j]){
    				count++;
    				sum = 0;
    				int len = j - i;
    				for(int k = i, l = j; k < str.length(), l < str.length(); k += len, l += len){
    					if(d[k][l]){		//相邻循环节间的关系,必定是i,j都相差一个循环节长度 
    						sum++;			//所以k,l的变化不是++; 
    						d[k][l] = 0;
    					}
    					else
    						break;
    				}
    				sum += 1;
    				if(sum > max1){  //如果循环节数量比最大的长,则跟新最长的 
    					max1 = sum;
    					maxstr = find(i, j); 
    //					cout << maxstr << "sum: " << sum << " i:" << i << " j: " << j << endl; 
    				}
    				else{			//如果循环节数量跟最长的一样,则跟判断字符串的字典序,若小于原串,则更新 
    					string ff = find(i, j); 
    					if(maxstr > ff && max1 == sum){
    						maxstr = ff;
    						max1 = sum;   //不要忘记跟新max1 
    //						cout << "QGQ: " << maxstr<< " sum= " << max1 << endl;
    					}
    				}
    			} 
    		}
    //		cout << endl;
    	}
    	for(int i = 0; i < max1; i++)
    		cout << maxstr;	
    	return 0;
    }
    
  • 相关阅读:
    Newtonsoft.Json 把对象转换成json字符串
    分页总页数计算方法 所有分页通用
    好用的Markdown编辑器一览 readme.md 编辑查看
    jquery bootgrid 一个很好的 数据控件,可用于任何语言
    史上最详细“截图”搭建Hexo博客——For Windows
    史上最详细“截图”搭建Hexo博客并部署到Github
    正则表达式30分钟入门教程
    [前端插件]为自己的博客增加打赏功能
    css浮动
    MetaWeblog API调用
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7735066.html
Copyright © 2011-2022 走看看