Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

[LeetCode] A String Replace Problem

$
0
0

题目连接: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 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>