字符串基礎題目總結

1.字符串長度
給定一行長度不超過100的字符串,請你求出它的具體長度。
輸入格式
輸入一行,表示一個字符串。注意字符串中可能包含空格。
輸出格式
輸出一個整數,表示它的長度。
輸入樣例:
I love Beijing.
輸出樣例:
15
算法1
C語言代碼

#include<string.h>
#include<stdio.h>
int main()
{
    char s[105];
    gets(s);
    printf("%d",strlen(s));
    return 0;
}

算法2
C++ 代碼

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    string a;
    getline(cin,a);
    cout<<a.size()<<endl;
    return 0;
}

算法3
C++ 代碼

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char a[105];
    cin.get(a,105);
    cout<<strlen(a)<<endl;
    return 0;
}

算法4
C++ 代碼

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char a[105];
    cin.getline(a,105);
    cout<<strlen(a)<<endl;
    return 0;
}
// cin 和 scanf讀入字符串時遇到空格就停止了。

2.字符串中的數字個數
輸入一行字符,長度不超過100,請你統計一下其中的數字字符的個數。
輸入格式
輸入一行字符。注意其中可能包含空格。
輸出格式
輸出一個整數,表示字數字字符的個數。
輸入樣例:
I am 18 years old this year.
輸出樣例:
2

#include<bits/stdc++.h>
using namespace std;
int main(){
	char str[101];
	cin.getline(str,101);
		int res=0;
		int len=strlen(str);
		for(int i=0;i<len;i++){
		if(str[i]=='0'||str[i]=='1'||str[i]=='2'||str[i]=='3'||str[i]=='4'||str[i]=='5'||str[i]=='6'||str[i]=='7'||str[i]=='8'||str[i]=='9') res++;
		}
		printf("%d",res); 
	return 0;
}

3.字符串匹配
給定兩個長度相同的字符串 a 和字符串 b。
如果在某個位置 i 上,滿足字符串 a 上的字符a[i]和字符串 b 上的字符b[i]相同,那麼這個位置上的字符就是匹配的。
如果兩個字符串的匹配位置的數量與字符串總長度的比值大於或等於k,則稱兩個字符串是匹配的。
現在請你判斷給定的兩個字符串是否匹配。
輸入格式
第一行包含一個浮點數k,第二行包含字符串 a,第三行包含字符串 b。
輸入的字符串中不包含空格。
輸出格式
如果兩個字符串匹配,則輸出“yes”。
否則,輸出“no”。
數據範圍
0≤k≤10≤k≤1,
字符串的長度不超過100。
輸入樣例:
0.4
abcde
xbacd
輸出樣例:
no

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string a,b;
    int sum=0;
    double t;
    cin>>t>>a>>b;
    for(int i=0;i < a.size(); i++)
        if(a[i] == b[i])
            sum++;
    double n = (double)sum / a.size();
    n >= t ? cout<<"yes" : cout<<"no";
}

4.循環相剋令
循環相剋令是一個兩人玩的小遊戲。
令詞爲“獵人、狗熊、槍”,兩人同時說出令詞,同時做出一個動作——獵人的動作是雙手叉腰;狗熊的動作是雙手搭在胸前;槍的動作是雙手舉起呈手槍狀。
雙方以此動作判定輸贏,獵人贏槍、槍贏狗熊、狗熊贏獵人,動作相同則視爲平局。
現在給定你一系列的動作組合,請你判斷遊戲結果。
輸入格式
第一行包含整數T,表示共有T組測試數據。
接下來T行,每行包含兩個字符串,表示一局遊戲中兩人做出的動作,字符串爲“Hunter”, “Bear”, “Gun”中的一個,這三個單詞分別代表獵人,狗熊和槍。
輸出格式
如果第一個玩家贏了,則輸出“Player1”。
如果第二個玩家贏了,則輸出“Player2”。
如果平局,則輸出“Tie”。
數據範圍
1≤N≤1001≤N≤100
輸入樣例
3
Hunter Gun
Bear Bear
Hunter Bear
輸出樣例
Player1
Tie
Player2

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int t;
    cin>> t;
   string a, b;
    while(t--){
        cin>> a >> b;
        if(a == "Hunter" && b == "Bear")  cout<< "Player2" << endl;
         if(a == "Hunter" && b == "Gun") cout<< "Player1" << endl;
         if(a == "Hunter" && b == "Hunter") cout<< "Tie" << endl;
         if(a == "Bear" && b == "Hunter") cout<< "Player1" << endl;
         if(a == "Bear" && b == "Bear") cout<< "Tie" << endl;
         if(a == "Bear" && b == "Gun") cout<< "Player2" << endl;
         if(a == "Gun" && b == "Hunter") cout << "Player2"<< endl;
         if(a == "Gun" && b == "Bear") cout<< "Player1" << endl;
         if(a == "Gun" && b == "Gun") cout<< "Tie" << endl;
    }
    return 0;
}

5.輸出字符串
給定一個字符串a,請你按照下面的要求輸出字符串b。
給定字符串a的第一個字符的ASCII值加第二個字符的ASCII值,得到b的第一個字符;
給定字符串a的第二個字符的ASCII值加第三個字符的ASCII值,得到b的第二個字符;
給定字符串a的倒數第二個字符的ASCII值加最後一個字符的ASCII值,得到b的倒數第二個字符;
給定字符串a的最後一個字符的ASCII值加第一個字符的ASCII值,得到b的最後一個字符。
輸入格式
輸入共一行,包含字符串a。注意字符串中可能包含空格。
數據保證字符串內的字符的ASCII值均不超過63。
輸出格式
輸出共一行,包含字符串b。
數據範圍
2≤a的長度≤100
輸入樣例:
1 2 3
輸出樣例:
QRRSd

#include <iostream>
using namespace std;
int main() {
    string a;
    getline(cin, a);
    for(int i = 0; i < a.size(); ++i)
        cout << (char)(a[i] + a[(i + 1) % a.size()]);
    return 0;
}

6.字符串加空格
給定一個字符串,在字符串的每個字符之間都加一個空格。
輸出修改後的新字符串。
輸入格式
共一行,包含一個字符串。注意字符串中可能包含空格。
輸出格式
輸出增加空格後的字符串。
數據範圍
1≤字符串長度≤1001≤字符串長度≤100
輸入樣例:
test case
輸出樣例:
t e s t c a s e

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
    char str[101];
    cin.getline(str,101);
    int len=strlen(str);
    for(int i=0;i<len-1;i++){
        cout<<str[i]<<" ";
    }
    cout<<str[len-1];
    
    return 0;
}

7.去掉多餘的空格
輸入一個字符串,字符串中可能包含多個連續的空格,請將多餘的空格去掉,只留下一個空格。
輸入格式
共一行,包含一個字符串。
輸出格式
輸出去掉多餘空格後的字符串,佔一行。
數據範圍
輸入字符串的長度不超過200。
輸入樣例:
Hello world.This is c language.
輸出樣例:
Hello world.This is c language.

#include <iostream>
using namespace std;

int main()
{
    string s;
    getline(cin, s);
    for(int i = 0; i < s.size(); i++)
        if(s[i] != ' ' || s[i+1] != ' ') cout << s[i];
    return 0;
}

8.信息加密
在傳輸信息的過程中,爲了保證信息的安全,我們需要對原信息進行加密處理,形成加密信息,從而使得信息內容不會被監聽者竊取。
現在給定一個字符串,對其進行加密處理。
加密的規則如下:
字符串中的小寫字母,a加密爲b,b加密爲c,…,y加密爲z,z加密爲a。
字符串中的大寫字母,A加密爲B,B加密爲C,…,Y加密爲Z,Z加密爲A。
字符串中的其他字符,不作處理。
請你輸出加密後的字符串。
輸入格式
共一行,包含一個字符串。注意字符串中可能包含空格。
輸出格式
輸出加密後的字符串。
數據範圍
輸入字符串的長度不超過100。
輸入樣例:
Hello! How are you!
輸出樣例:
Ifmmp! Ipx bsf zpv!

#include <iostream>
using namespace std;

int main()
{
    string s;int i;
    getline(cin,s);
    for(i=0;i<s.length();i++)
    {
        if(s[i]>='A'&&s[i]<='Y') s[i]+=1;else
        if(s[i]=='Z') s[i]='A';
        if(s[i]>='a'&&s[i]<='y') s[i]+=1;else
        if(s[i]=='z') s[i]='a';
        cout<<s[i];
    }
    return 0;
}

9.忽略大小寫比較字符串大小
一般我們用strcmp可比較兩個字符串的大小,比較方法爲對兩個字符串從前往後逐個字符相比較(按ASCII碼值大小比較),直到出現不同的字符或遇到’\0’爲止。
如果全部字符都相同,則認爲相同;如果出現不相同的字符,則以第一個不相同的字符的比較結果爲準。
但在有些時候,我們比較字符串的大小時,希望忽略字母的大小,例如”Hello”和”hello”在忽略字母大小寫時是相等的。
請寫一個程序,實現對兩個字符串進行忽略字母大小寫的大小比較。
輸入格式
輸入爲兩行,每行一個字符串,共兩個字符串。注意字符串中可能包含空格。
數據保證每個字符串的長度都不超過80。
輸出格式
如果第一個字符串比第二個字符串小,輸出一個字符”<”。
如果第一個字符串比第二個字符串大,輸出一個字符”>”。
如果兩個字符串相等,輸出一個字符”=”。
輸入樣例:
Hello
hello
輸出樣例:

#include <bits/stdc++.h>
using namespace std;
int main() {
    string s,t;
    int i,j,lens,lent;
   getline(cin,s);
    getline(cin,t);
    lens =s.length();
    lent = t.length();
    for(i = 0; i < lens; i++)
        s[i] = tolower(s[i]);
    for(j = 0; j < lens; j++)
        t[j] = tolower(t[j]);
    if(lens <lent) swap(lens,lent);
        for(i = 0; i < lens;) {
            if(t[i] == s[i]){
                i++;    }
            else if(t[i] < s[i]) {
                printf(">");
                break;
            } else if(t[i] > s[i]) {
                printf("<");
                break;
            }
        }
        if(i == lens)
            printf("=\n");
    return 0;
}

10.替換字符
給定一個由大小寫字母構成的字符串。
把該字符串中特定的字符全部用字符“#”替換。
請你輸出替換後的字符串。
輸入格式
輸入共兩行。
第一行包含一個長度不超過30的字符串。
第二行包含一個字符,表示要替換掉的特定字符。
輸出格式
輸出共一行,爲替換後的字符串。
輸入樣例:
hello
l
輸出樣例:
he##o

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main(){
    string s;
    char c;
    getline(cin,s);
    cin>>c;
    int len=s.size();
    for(int i=0;i<len;i++){
        if(s[i]==c) s[i]='#';
    }
      for(int i=0;i<len;i++){
          printf("%c",s[i]);
      }
    return 0;
}

11.單詞替換
輸入一個字符串,以回車結束(字符串長度不超過100)。
該字符串由若干個單詞組成,單詞之間用一個空格隔開,所有單詞區分大小寫。
現需要將其中的某個單詞替換成另一個單詞,並輸出替換之後的字符串。
輸入格式
輸入共3行。
第1行是包含多個單詞的字符串 s;
第2行是待替換的單詞a(長度不超過100);
第3行是a將被替換的單詞b(長度不超過100)。
輸出格式
共一行,輸出將s中所有單詞a替換成b之後的字符串。
輸入樣例:
You want someone to help you
You
I
輸出樣例:
I want someone to help you
1.直接用char數組存儲,輸出時比較即可

#include<bits/stdc++.h>
using namespace std;
int main()
{
    char s[10005][105];int i=1;
    while(cin>>s[i]) i++;
    for(int j=1;j<i-2;j++)
        if(strcmp(s[i-2],s[j])==0)
            printf("%s ",s[i-1]);
        else
            printf("%s ",s[j]);
    return  0;
}

2.正則表達式解決替換單詞問題:

#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main(){
    string s,s1,s2;
    getline(cin,s);
    cin>>s1>>s2;
    cout<<regex_replace(s,regex("\\b" + s1 + "\\b"),s2)<<endl;
    return 0;
}

普及一下正則表達式常用函數:這個鏈接還行
regex_match:全文匹配,要求整個字符串符合正則表達式的匹配規則。用來判斷一個字符串和一個正則表達式是否模式匹配,如果匹配成功則返回true,否則返回false。
regex_search:搜索匹配,根據正則表達式來搜索字符串中是否存在符合規則的子字符串。
regex_replace:替換匹配,即可以將符合匹配規則的子字符串替換爲其他字符串。要求輸入一個正則表達式,以及一個用於替換匹配子字符串的格式化字符串。這個格式化字符串可以通過轉義序列引用匹配子字符串中的部分內容。
語法規則:

  1. \ 表示將下一字符標記爲特殊字符、轉義字符;
  2. ^ 表示字符串的開始,匹配輸入字符串開始的位置;
  3. ^$ 表示字符串的結尾,匹配輸入字符串結尾的位置;
  4. . 表示匹配除換行符" \n "以外的任意字符;
  5. \w 表示任意字母、數字、下劃線 ;
  6. \s 表示任意空白符(tab也包含在內);
  7. \d 表示匹配單個數字字符,\D 表示非數字字符匹配;
  8. [] 表示一個字符集合,匹配指定範圍內的任何字符,例如[a-z]表示字母a~z所組成的集合;
  9. []中使用來表示集合的補集,匹配不在指定的範圍內的任何字符,例如[1-3]表示除1 2 3以外數字;
  10. [[:alpha:]] 表示任何字母;
  11. [[:alnum:]] 表示任何字母和數字;
  12. regex::icase 表示匹配時忽略大小寫;
  13. {n} 表示正好匹配 n 次前面的字符或表達式,例如"hello{6}",匹配字符串中符合第二個l後邊有6個o的子字符串;
  14. {n, } 表示至少匹配 n 次前面的字符或表達式;
  15. {n,m} 表示匹配至少 n 次,至多 m 次前面的字符或表達式;
    • 表示零次或多次匹配前面的字符或子表達式,等效於{0, };
    • 表示一次或多次匹配前面的字符或子表達式;
  16. ? 表示零次或一次匹配前面的字符或子表達式;
  17. \t \n \r這些平時非常常見,分別表示製表符匹配、換行符匹配、回車符匹配。
    相關習題:
    【GPLT】L1-058 6翻了
    【GPLT】L1-059 敲笨鍾
    12.字符串中最長的連續出現的字符
    求一個字符串中最長的連續出現的字符,輸出該字符及其出現次數,字符串中無空白字符(空格、回車和tab),如果這樣的字符不止一個,則輸出第一個。
    輸入格式
    第一行輸入整數N,表示測試數據的組數。
    每組數據佔一行,包含一個不含空白字符的字符串,字符串長度不超過200。
    輸出格式
    共一行,輸出最長的連續出現的字符及其出現次數,中間用空格隔開。
    輸入樣例:
    2
    aaaaabbbbbcccccccdddddddddd
    abcdefghigk
    輸出樣例:
    d 10
    a 1
#include <iostream>
using namespace std;
int main()
{
    int T;
    cin >> T;
    while(T --)
    {
        int maxn = -1;//maxn記錄最大長度
        string str, maxs;//maxs記錄最大長度時的字符
        cin >> str;
        for(int i = 0; i < str.size(); i ++)
        {
            int j = i;
            int cnt = 0;
            while(str[j] == str[i] && j < str.size())//當指針j沒有越界且與指針i的內容相同時移動
                j ++, cnt ++;
            if(cnt > maxn)//更新最大值
                maxn = cnt, maxs = str[i];
            i = j - 1;//移動指針i
        }
        cout << maxs << " " << maxn << endl;
    }
}

13.只出現一次的字符
給你一個只包含小寫字母的字符串。
請你判斷是否存在只在字符串中出現過一次的字符。
如果存在,則輸出滿足條件的字符中位置最靠前的那個。
如果沒有,輸出”no”。
輸入格式
共一行,包含一個由小寫字母構成的字符串。
數據保證字符串的長度不超過100000。
輸出格式
輸出滿足條件的第一個字符。
如果沒有,則輸出”no”。
輸入樣例:
abceabcd
輸出樣例:
e

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
    string str;
    getline(cin,str);
    int s[300]={0};
    for(int i=0;i<str.length();i++)
    {
        s[str[i]]++;//統計各個字符出現的次數
    }
    char p=-1;
    for(int i=0;i<str.length();i++)//如果遇到第一個字符出現次數爲1.則把該字符賦值給c,break退出for循環。
    {
        if(s[str[i]]==1)
        {
            p=str[i];
            break;
        }
    }
    if(p==-1) puts("no");
    else  printf("%c",p);
    return 0;
}

14.字符串插入
有兩個不包含空白字符的字符串str和substr,str的字符個數不超過10,substr的字符個數爲3。(字符個數不包括字符串結尾處的’\0’。)
將substr插入到str中ASCII碼最大的那個字符後面,若有多個最大則只考慮第一個。
輸入格式
輸入包括若干行,每一行爲一組測試數據,格式爲
str substr
輸出格式
對於每一組測試數據,輸出插入之後的字符串。
輸入樣例:
abcab eee
12343 555
輸出樣例:
abceeeab
12345553

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string str,s;
    while(cin>>str>>s)
    {
        int maxn=0,index=-1;
        for(size_t i=0;i!=str.size();++i)
            if(str[i]>maxn)
                maxn=str[i],index=i;
        cout<<str.substr(0,index+1)<<s<<str.substr(index+1,-1)<<endl;
    }
    return 0;
}

講一下C++中substr函數的用法


#include<string>
#include<iostream>
using namespace std;

main()
{
string s("12345asdf");
string a=s.substr(0,5);       //獲得字符串s中 從第0位開始的長度爲5的字符串//默認時的長度爲從開始位置到尾
cout<<a<<endl;
}
//輸出結果爲:
//12345

另一種寫法

#include <bits/stdc++.h>
using namespace std;
int main()
{
    char str[11], substr[4];
    int n = 2;
    while(scanf("%s %s", str, substr) != EOF){
        int cnt = str[0], res = 0;
        for(int i = 0; i < strlen(str); i++){
            if(str[i] > cnt) cnt = str[i], res = i;
            else if(str[i] == cnt) continue;
        }
        for(int i = 0; i <= res; i ++){
            cout<< str[i];
        }
        for(int i = 0; i < strlen(substr); i++){
            cout<< substr[i];
        }
        for(int i = res + 1; i < strlen(str); i++){
            cout<< str[i];
        }
        puts("");
    }
    return 0;
}

15.最長單詞
一個以’.’結尾的簡單英文句子,單詞之間用空格分隔,沒有縮寫形式和其它特殊形式,求句子中的最長單詞。
輸入格式
輸入這個簡單英文句子,長度不超過500。
輸出格式
該句子中最長的單詞。如果多於一個,則輸出第一個。
輸入樣例:
I am a student of Peking University.
輸出樣例:
University

#include<cstring>
#include<iostream>
using namespace std;
string l,lm;
int len,maxx,f;
int main(){
    while(cin>>l){
        len=l.size();
        if(l[len-1]=='.'){
            len--;
            l.erase(len,1);//刪除len後一個字符,即這個句號
            f=1;
        }
        if(len>maxx){//更新長度最大的那個字符串
            lm=l;
            maxx=len;
        }
        if(f) break;
    }
    cout<<lm;
    return 0;
}

這裏提一下erase
// 用法一

vector<string> e = {"a","b","c","d","e","f","g"};
auto it = e.end()-1;  //.end()指向末尾的前一個元素,因此需要-1,指向末尾元素    
e.erase(it);           //刪除末尾元素“g”

// 用法二

auto it2 = e.begin()+1;
auto it3 = e.end()-2;
e.erase(it2,it3);    //刪除it2到it3之間的元素

對於第二種用法,可以拓展一下:


auto it = a.begin();
auto it2 = find(a.begin(), a.find(), "c");        //it2指向“c”所在位置
auto it3 = a.erase(it,it2);    //刪除it到it2之間的所有元素,即“a”和“b”
a.erase(it3);                  //此時刪除的是“c”,即先前it2所指,因爲第三種用法返回的就是

第二個迭代器所指位置
實際上,erase函數本來是用來操作string的,函數原型如下:
(1)string& erase ( size_t pos = 0, size_t n = npos );刪除從pos開始的n個字符,比如erase(0,1)就是刪除第一個字符
(2)iterator erase ( iterator position );刪除position處的一個字符(position是個string類型的迭代器)
(3)iterator erase ( iterator first, iterator last );刪除從first到last之間的字符(first和last都是迭代器)
第二種第三種就是上面操作容器的方式,第一種用法如下:

string str ("This is an example phrase.");
str.find("an");
str.erase(10);            // 也可以使用下標進行刪除操作,刪除下標10開始及以後的字符
str.erase (10,8);          // 此處意爲刪除下標‘10’開始的連續8個字符
//注:第一個參數表示的是下標值“10”!不是第10個!

16.倒排單詞
編寫程序,讀入一行英文(只包含字母和空格,單詞間以單個空格分隔),將所有單詞的順序倒排並輸出,依然以單個空格分隔。
輸入格式
輸入爲一個字符串(字符串長度至多爲100)。
輸出格式
輸出爲按要求排序後的字符串。
輸入樣例:
I am a student
輸出樣例:
student a am I

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s[10005];int i=1;
    while(cin>>s[i]) i++;
    for(int j=i-1;j>=1;j--) cout<<s[j]<<" ";
    return 0;
}

17.字符串移位包含問題
對於一個字符串來說,定義一次循環移位操作爲:將字符串的第一個字符移動到末尾形成新的字符串。
給定兩個字符串s1和s2,要求判定其中一個字符串是否是另一字符串通過若干次循環移位後的新字符串的子串。
例如CDAA是由AABCD兩次移位後產生的新串BCDAA的子串,而ABCD與ACBD則不能通過多次移位來得到其中一個字符串是新串的子串。
輸入格式
共一行,包含兩個字符串,中間由單個空格隔開。
字符串只包含字母和數字,長度不超過30。
輸出格式
如果一個字符串是另一字符串通過若干次循環移位產生的新串的子串,則輸出true,否則輸出false。
輸入樣例:
AABCD CDAA
輸出樣例:
true

#include <iostream>
#include <string>
using namespace std;
bool check(string a, string b)
{
    int len = a.size();
    a += a; //複製字符串並連接
    if (a.find(b) >= 0 && a.find(b) < len) return true; //判斷是否包含
    return false;
}
int main()
{
    string a, b;
    cin >> a >> b;
    if (check(a, b) || check(b, a)) cout << "true";
    else cout << "false";
    return 0;
}

18.字符串乘方
給定兩個字符串a和b,我們定義ab爲他們的連接。
例如,如果a=”abc” 而b=”def”, 則a
b=”abcdef”。
如果我們將連接考慮成乘法,一個非負整數的乘方將用一種通常的方式定義:a0a0=””(空字符串),a(n+1)a(n+1)=a∗(an)a∗(an)。
輸入格式
輸入包含多組測試樣例,每組測試樣例佔一行。
每組樣例包含一個字符串s,s的長度不超過100。
最後的測試樣例後面將是一個點號作爲一行。
輸出格式
對於每一個s,你需要輸出最大的n,使得存在一個字符串a,讓s=ans=an。
輸入樣例:
abcd
aaaa
ababab
輸出樣例:
1
4
3

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    while(cin>>s)
    {
        int flag;
        if(s[0]=='.')   break;
        int len=s.size();
        for(int i=1;i<=len;i++)
        {
            flag=0;
            if(len%i!=0)    continue;
            for(int j=0;j<len;j++)
                if(s[j]!=s[j%i])    {flag=1;break;}
            if(!flag)   {cout<<len/i<<endl;break;}
        }
        if(flag)    cout<<"-1"<<endl;
    }
}

19.字符串最大跨距
有三個字符串S,S1,S2,其中,S長度不超過300,S1和S2的長度不超過10。
現在,我們想要檢測S1和S2是否同時在S中出現,且S1位於S2的左邊,並在S中互不交叉(即,S1的右邊界點在S2的左邊界點的左側)。
計算滿足上述條件的最大跨距(即,最大間隔距離:最右邊的S2的起始點與最左邊的S1的終止點之間的字符數目)。
如果沒有滿足條件的S1,S2存在,則輸出-1。
例如,S = “abcd123ab888efghij45ef67kl”, S1=”ab”, S2=”ef”,其中,S1在S中出現了2次,S2也在S中出現了2次,最大跨距爲:18。
輸入格式
輸入共一行,包含三個字符串S,S1,S2,字符串之間用逗號隔開。
數據保證三個字符串中不含空格和逗號。
輸出格式
輸出一個整數,表示最大跨距。
如果沒有滿足條件的S1和S2存在,則輸出-1.
輸入樣例:
abcd123ab888efghij45ef67kl,ab,ef
輸出樣例:
18

#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main()
{

    string S,S1,S2;
    int i=0;
    char a;
    while(cin>>a)
    {
        if(a!=',')
        {
            if(i==0) S+=a;
            else if(i==1) S1+=a;
            else S2+=a;
        }
        else i++;
    }
    int s,s1,s2;
    s1=S.find(S1);
    s2=S.rfind(S2);
    if(s1!=-1&&s2!=-1&&(s1+S1.length()-1)<s2){
        cout<<s2-s1-S1.length()<<endl;
    }
    else cout<<"-1"<<endl;

}

20.最長公共字符串後綴
給出若干個字符串,輸出這些字符串的最長公共後綴。
輸入格式
由若干組輸入組成。
每組輸入的第一行是一個整數N。
N爲0時表示輸入結束,否則後面會繼續有N行輸入,每行是一個字符串(字符串內不含空白符)。
每個字符串的長度不超過200。
輸出格式
共一行,爲N個字符串的最長公共後綴(可能爲空)。
數據範圍
1≤N≤2001≤N≤200
輸入樣例:
3
baba
aba
cba
2
aa
cc
2
aa
a
0
輸出樣例:
ba
a

#include<bits/stdc++.h>
using namespace std;
int n;
string l[201];
int main(){
    while(cin>>n){
        if(n==0) return 0;
        int lm=9999999,la=0;
        for(int i=1;i<=n;i++){
            cin>>l[i];
            int len=l[i].size();
            lm=min(len,lm);
        }
        for(int i=1;i<=lm;i++){
            int f=1;
            for(int j=1;j<n;j++){
                int l1=l[j].size(),l2=l[j+1].size();
                if(l[j][l1-i]!=l[j+1][l2-i]){
                    f=0;
                    break;
                }
            }
            if(!f) break;
            else la++;
        }
        for(int i=la;i;i--) cout<<l[1][l[1].size()-i];
        cout<<endl;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章