string+STL——Password

題目來源

DBSDFZOJ Password

http://218.62.22.209:8080/problem.php?cid=1408&pid=0


題目描述

你來到了一個廟前,廟牌上有一個僅包含小寫字母的字符串 s。

傳說打開廟門的密碼是這個字符串的一個子串t,並且t既是s的前綴又是s的後綴並且還在s的中間位置出現過。
如果存在這樣的串,請你輸出這個串,如有多個滿足條件的串,輸出最長的那一個。
如果不存在這樣的串,輸出"Just a legend"(去掉引號)。


輸入格式
僅一行,字符串 s。


輸出格式
如題所述


樣例輸入
fixprefixsuffix


樣例輸出
fix


數據範圍
對於60%的數據,s的長度<=100

對於100%的數據,s的長度<=100000


思路

當然是用我萬能的string系統函數啦

處理兩個字符串(原字符串爲s)

see——s去掉開頭和結尾的各一個字符

re——s倒序

i=s.size()~1循環驗證是否有長度爲i的子串符合要求

如果有 輸出該子串並結束程序

在循環中暴力比較s的長度爲i的前綴是否也是s的後綴

如果是 取字符串mos爲s的長度爲i的前綴

在see中尋找mos是否出現過

如果出現過 則mos即爲所求字符串


代碼(C++)

#include <cstdio> 
#include <string> 
#include <iostream> 
using namespace std; 
int len,k;  bool w;  
string s,re,ans,mos,see; 
int main() 
{ 
    cin>>s; //懶得寫讀入優化了就cin吧
    len=s.size(); 
    see=s;  see.erase(len-1);   see.erase(0,1); 
    for(int i=0;i<len;i++) 
        re.append(1,s[len-i-1]);
    for(int i=len-3;i>=0;i--) 
    { 
        w=1;    k=i; 
        for(int j=0;j<=i&&w==1;j++,k--) 
	        if(s[k]!=re[j]) 
                w=0; 
        if(w==1) 
        { 
            mos.assign(s,0,i+1); 
            if(see.find(mos,0)!=string::npos) 
            { 
                cout<<mos; 
                return 0; 
            } 
        } 
    } 
    cout<<"Just a legend"; 
    return 0;
}


發佈了57 篇原創文章 · 獲贊 39 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章