倒着来是处理字符串等的一个不错的技巧。举个例子,和这道题无关的,但是难度和意义都是更好的。
比如非完全匹配,就是差一个字符不匹配
那么其实有一种复杂度还不错的做法:
模式串:aacb
需要匹配的字符串:
1、aamb
2、acb
3、aamdb
这个时候其实可以先正向匹配,算出来匹配的字符的个数p1,再反向匹配,算出来匹配的个数p2,然后看p1+p2与模式串的长度的关系
恩,以上...还没做过具体题目
再看这道题,也是倒着处理字符串的思路:O(n)处理掉
#include <cstdio> #include <cstring> #include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int SIZE = 1000000+1; char str[SIZE]; char ans[SIZE*2]; int leng; void solve(){ leng = strlen(str); int blank = 0; for(int i=0;i<leng;i++){ if(str[i] == ' ')blank++; } int ansleng = blank*2+leng; int oldptr = leng-1; int newptr = ansleng-1; ans[ansleng] = '\0'; while(oldptr>=0){ if(str[oldptr] == ' '){ ans[newptr]='0'; ans[--newptr]='2'; ans[--newptr]='%'; }else{ ans[newptr]=str[oldptr]; } //cout << newptr << " " << oldptr << endl; --newptr; --oldptr; } printf("%s\n",ans); } int main(){ //freopen("03.txt","r",stdin); while(cin.getline(str,SIZE)){ //cout << str << endl; solve(); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-10 07:42:11