hust 1589 找出子串

题目描述

给定一个字符串s ,求出一个子串t,满足如下性质:
1.       t是s的一个前缀。
2.       t是s的一个后缀。
3.       t出现在s的中间(并非前缀和后缀)。
例如:
字符串s为fixprefixsuffix,t可以是fix。
字符串s为aaa,t可以是aa。
输入

输入包括多组数据,每组数据为一行,每行有一个字符串s,其长度不超过10^6(一百万)。

输出

每组数据输出一行,每行为一个字符串t,若不存在字符串t,则输出"Just a legend"(不包括引号)。样例输入

fixprefixsuffix
abcdabc

样例输出

fix
Just a legend

很经典的一道KMP算法题目,求是前缀又是后缀的字串,再判断是否出现在中间,很简单,有kmp判断,再用dp判断是否出现的次数大于2,这样就可以了,题目aaa那个不对,还有就是这个题要求输出最长的,题目没有说清楚,WA了两次,真是晕
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int maxn=1000000+10;
char p[maxn];
int f[maxn],dp[maxn],a[maxn];
void getf()
{
    int m=strlen(p);
    f[0]=f[1]=0;
    for (int i=1;i<m;i++)
    {
        int j=f[i];
        while(j && p[i]!=p[j]) j=f[j];
        f[i+1]=(p[i]==p[j]?j+1:0);
    }
}

int main()
{
    int n;
    bool flag;
    while(scanf("%s",p)!=EOF)
    {
        getf();
        //for (int i=1;i<=strlen(p);i++) printf("%d ",f[i]);
        //printf("\n");
        memset(dp,0,sizeof(dp));
        int L=strlen(p);
        int k=L;n=0;
        while(f[k])
        {
            if (f[k]) a[n++]=f[k];
            k=f[k];
        }
        //for (int i=0;i<n;i++) printf("%d ",a[i]);
        //printf("\n");
        for (int i=L;i>=0;i--)
        {
            dp[i]++;
            dp[f[i]]+=dp[i];
        }
        flag=false;
        for (int i=0;i<n;i++)
        {
            if(dp[a[i]]>=3)
            {
                flag=true;
                for (int j=0;j<a[i];j++) printf("%c",p[j]);
                printf("\n");
                break;
            }
        }
        if (!flag) printf("Just a legend\n");
    }
    return 0;
}

作者 chensunrise

hust 1589 找出子串,布布扣,bubuko.com

时间: 2024-10-17 05:27:03

hust 1589 找出子串的相关文章

KMP小扩展,找出子串在主串中出现的所有位置

KMP算法能够高效地匹配字符串,找出子串(T串)在主串(S串)中出现的首个位置的原算法网上已经有很多优秀的博文进行详细讲解,这里就不多赘述. 这篇博文主要是对KMP原算法稍作改动,使其能够在主串中把所有匹配的主串找出来. 找出首个匹配的算法好弄,next数组求出来后直接用来匹配,直到出现完全匹配的情况的时候就停止搜索把答案扔出来就行,但是想把所有T串找出来的话就得完全把S串搜完, 就算已经在S串中找到一个T串后也是不能马上停止搜索的. 难点就在已经完全匹配了一个T串以后怎么继续进行下一个匹配.

leetcode 5 :Longest Palindromic Substring 找出最长回文子串

题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 翻译: 找出字符串s中最长的回文子串,字符串s的最长是1000,假设存在唯一的最长回文子串 法一:直接暴力破解 O(N3)的时间复杂度,运行超

找出此产品描述中包含N个关键字的长度最短的子串

阿里巴巴笔试题:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号:再给定N个英文关键词,请说明思路并变成实现方法. String extractSummary(String description , String[] keyWords) 目标:找出此产品描述中包含N个关键字的长度最短的子串(20分) W0 W1 W2 W3  Q0 W4 W5 Q1 W6 W7 W8 Q0 W9 Q1 P335 <编程之美>上的参考代码: int nTarget = N + 1

找出给定的一个字符串中最大的不重复子串,不重复子串即一个子串中不出现两个相同的字符

思路一:先找出一个字符串中所有子串,再找出所有子串中最长的那一个:思路二:每次找出的子串长度都比上一次的子串长,则最后的子串即是最长子串的长度数.我选择的是第二种方法. public class FindSubstringMaxlengthNoduplicate { public static void main(String[] args) { String s = "adcdghcwioizhfksjdyuiodfhjskhgkhgeisdcjdkh"; ArrayList<

找出所有最长连续重复子串及其个数

问题描述: 找出字符串中所以最长连续重复子串及其个数 比如:输入:123234,最大连续重复字符串为23,个数为2 输入:5555,最大连续重复字符串为555,个数为2 输入:aaabbb 最大连续重复字符串为aa,个数为2:和bb,个数为2 必须存在重复的字符串才算,只出现一次的不算.可能存在多个相同长度的不同字符串,比如aaabbb. 分析:最直接的想法是利用两个指针循环遍历比较所有可能的子串,记录下所有子串长度,然后找到所有最大连续子串及其个数,时间复杂度为O(n^2).在网上看到一种利用

C#中的字符串处理——找出最长数字子串

百度测试部2015年10月份的面试题之——字符串处理,找出最长的子串. 代码如下: private static string SelectNumberFromString(string input) { string result = ""; foreach (Match match in Regex.Matches(input, @"\d+"))//不要在匹配字符串的开头和结尾加上"^"和"$". { result = m

黑马程序员——找出两个字符串中最大的子串

找出两个字符串中最大的子串 </pre><pre name="code" class="java">public class StringMaxString { //找一个字符串的最大子串 public static void main(String[] args) { // TODO Auto-generated method stub String s1="qwerabcdtyuiop"; String s2=&quo

【leetcode-03】给定一个字符串,请你找出其中不含有重复字符的最长子串的长度

开个新坑,leetcode上面做题目.下面是题目描述: <!-- 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1. 示例 3: 输入: "pwwkew" 输出

找出一个字符串中最长重复次数的子字符串,并计算其重复次数

原题 找出一个字符串中最长重复次数的子字符串,并计算其重复次数.例如:字符串"abc fghi bc kl abcd lkm abcdefg",并返回"abcd"和2. 我的思路 为了方便表述,我们使用变量src作为原字符串,sub_str作为子字符串. 由于题目要求寻找至少重复2次的最长的子字符串,重点在于最长的子字符串,而不在于重复的最多次数.因此我们可以从长度最长的字符串入手,计算其重复次数.只要重复达到2次,即可返回该字符串. 显然长度最长的子字符串就是原串