洛谷1032字串變換
阿新 • • 發佈:2018-12-04
你只有非常努力,才能看起來毫不費力。
這個題目讓我學到了很多東西吧,尤其是string的應用。不得不感嘆STL實在是太強大了。
思路:就是無腦的bfs,但是我還是做了好久
當時的錯誤:很容易錯的就是,當你遍歷一個字串的時候,你會只遍歷第一個將要轉換的字元。比如accacc有a->b,能計算到bccacc之後的例子,但是計算不到accbcc之後的
收穫:
一:string的相關操作
- s.find()和s.rfind()
①find(string str,int pos);第一個引數是string型別的。從s的pos位置開始找,找到str就返回下標。
②find(char* str,int pos)和①一樣
find(char* str,int pos,int n)表示的是從s的pos位置開始查詢,找到和str的前n位相同的子串就返回下標。這隻適用於char*。
③s.rfind()就是從後查詢而已。 - s.replace(pos,)
s.replace(pos, n, s1) 用s1替換s中從pos開始(包括0)的n個字元的子串。 -
擷取子串
s.substr(pos, n) 擷取s中從pos開始(包括0)的n個字元的子串,並返回
s.substr(pos) 擷取s中從從pos開始(包括0)到末尾的所有字元的子串,並返回
二:複習kmp演算法,之前老師是有講過的。
//洛谷 變字串 #include<bits/stdc++.h> using namespace std; const int maxn=50; string str1,str2; string from[7],to[7]; int num; queue<pair<string,int> > q; set<string> s; int bfs() { int i,j,cnt; q.push(make_pair<string,int>(str1,0)); string now,next; while(!q.empty()) { cnt=(q.front()).second; if(cnt>=10) return -1; now=(q.front()).first; q.pop(); for(i=0;i<num;i++){ int pos=now.find(from[i]); while(-1!=pos){ next=now; next.replace(pos,from[i].length(),to[i]); if(0==s.count(next)){ if(next==str2) return cnt+1; s.insert(next); q.push(make_pair<string,int>(next,cnt+1)); } pos=now.find(from[i],pos+1);//忽略了情況,就是主字串裡面有很多的子串 } } } return -1; } int main() { cin >> str1 >> str2; int i=0,j; while (i!=6&&cin >> from[i] >> to[i] ) i++; num=i; if(str1==str2){ printf("0\n"); return 0; } int cnt=bfs(); if(-1==cnt) printf("NO ANSWER!\n"); else printf("%d\n",cnt); return 0; }