题目连接:http://leetcode.com/2010/11/microsoft-string-replacement-problem.html
题目描述:其实就是将源字符串中与模式串匹配的部分都替换为特定的字符。如果有多个连续匹配,值替换成一个字符即可。
思路:
1、还是用一前一后的两个指针,前一个指针用于遍历,后一个指针用于修改值。
2、如果pFast当前所指的位置可以匹配,pFast向前移动Pattern长度,并且记下匹配的信息,直到找到第一个不能匹配的点。
3、如果标记显示有子串匹配。则将pSlow替换为指定的字符。
4、如果pFast还没有到Str的尾部,则将pFast赋给pSlow,因为pFast是刚刚找到的第一个未匹配的点。
核心代码参考如下:
bool IsMatch(const char *Str, const char *Pattern) { assert(Str && Pattern); while(*Pattern) { if(*Str++ != *Pattern++) { return false; } } return true; } void StrReplace(char *Str, const char *Pattern, const char ReplaceChar) { assert(Str && Pattern); int nLen = strlen(Pattern); if(nLen <= 0) { return; } char *pSlow, *pFast; pSlow = pFast = Str; bool isMatch = false; while(*pFast != '\0') { isMatch = false; while(IsMatch(pFast, Pattern))//略过与模式串匹配的部分,定位第一个不匹配的字符 { isMatch = true; pFast += nLen; } if(isMatch)//如果有匹配的,替换成相应字符 { *pSlow++ = ReplaceChar; } if(*pFast != '\0')//如果pFast没有指向末尾 { *pSlow++ = *pFast++; //等同于*(pSlow++) = *(pFast++);因为++的优先级高于* } } *pSlow = '\0';//加上结束标志 }
照旧,给出main函数的调用
#include<stdio.h> #include<assert.h> #include<string.h> int main() { const int MAX_N = 50; char Pattern[MAX_N]; char Str[MAX_N]; while(gets(Str) && gets(Pattern)) { StrReplace(Str, Pattern, 'X'); puts(Str); } return 1; }
作者:kay_zhyu 发表于2013-9-3 21:10:20 原文链接
阅读:51 评论:0 查看评论