這篇博客只是記錄一下我在做題過程中碰到的一些關於字符串巧妙的處理方式(可能只對我這個菜雞來說相對巧妙吧)
1、stringstream的使用
第一次碰到stringstream的使用是在紫書上面p112,題目是UVA10815。前幾天補字符串的題目的時候在 洛谷P1308統計單詞數 也碰到了一題可以使用stringstream的。
用法
有一個帶空格的字符串s,現在需要從裏面提取一個個的單詞,那可以進行如下操作。從s字符串中提取出一個個單詞,通過stringstream傳遞給word,然後輸出每一個單詞
string s, word;
stringstream ss(s);
while(ss>>word) cout<<word<<endl;
2、string庫中函數的使用
這邊將介紹的是find函數和replace函數
大水題poj3981 題目就是要你把字符串中所有的"you"替換成"we"
用法
string str, s;
int pos=str.find(s); //pos返回值是s首字母的下標位置
str.replace(pos, n, s); //把str字符串從第pos位開始後的n位換成字符串s
代碼片
//poj-3981
#include<bits/stdc++.h>
using namespace std;
int main() {
string s;
int pos;
while(getline(cin,s)) {
while( (pos=s.find("you"))!=-1 )
s.replace(pos,3,"we");
cout<<str<<endl;
}
return 0;
}
3、substr的使用以及reverse
這個是前幾天在codeforces上打比賽碰到的。場次是 CodeCraft-20 (Div. 2), 題目是 B. String Modification 。
題目描述
給定一個字符串s,給一個數字k表示以下操作:從該字符串 第1 到 第n-k+1 位,每次將字符串從第 i 位到第 i+k-1位進行反轉。
求一個 k 使得該字符串最小,並輸出反轉的字符串
思路
可以發現就是進行k次操作表示將字符串第k位前移,把第1位到第k位放到後面去,而第1位到第k位放到後面去是有兩種情況的,可能是正放,也可能是逆放。就看交換次數,奇數次逆放,偶數次正放。我就開了兩個字符串暴力做。
用法
s.substr(n,m); //表示在s字符串中從第n位開始取m個字符
reverse(s.begin(), s.end()); //表示將整個字符串反轉
代碼片
#include<bits/stdc++.h>
using namespace std;
void solve() {
string s1,s2,str;
int n;
cin>>n;
cin>>s1;
reverse(s1.begin(), s1.end());
s2=s1; //讓s2字符串逆序
reverse(s1.begin(), s1.end());
int ans=1;
str=s1;
string tmp;
for(int i=1; i<n; i++) {
//如果交換次數是奇數,後面部分就需要逆放了,此時用到s2字符串
if ( (n-i)&1 ) tmp=s1.substr(i,n-i)+s2.substr(n-i,i);
//正放就原處理就行了
else tmp=s1.substr(i,n-i)+s1.substr(0,i);
if ( tmp<str ) {
str=tmp;
ans=i+1;
}
}
cout<<str<<endl;
cout<<ans<<endl;
}
int main() {
// freopen("in.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--) {
solve();
}
return 0;
}