[华为oj]字符串通配符

该程序只满足匹配第一个相同的字符串,对于出现第二个相同字符的字符串无法解决。

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int IsMatch(string rule,string sub)
{
	int k=0;
	int c=0;
	while(k<rule.length()&&c<sub.length())
	{
		if(rule[k]==‘?‘)
		{
			++k;
			++c;
			continue;
		}

		if(rule[k]==‘*‘)

		{
			while(rule[k+1]!=sub[c])
			{
				if(sub[c]==‘#‘)
					return 0;
				++c;
			}
				++k;
		}

		if(rule[k]!=sub[c])
			return 0;

	    ++k;
		++c;
	}

	if(rule[--k]==sub[--c])
		return 1;
	else
		return 0;
}

string ToLower(string ss)
{
	string::iterator itr;
	for(itr=ss.begin();itr!=ss.end();itr++)
	{
		*itr=tolower(*itr);
	}
	return ss;
}

int main()
{
	string rule,sub;
	cin>>rule>>sub;
	rule=ToLower(rule);
	sub=ToLower(sub);
	rule.append("#");
	sub.append("#");
	if(IsMatch(rule,sub))
		cout<<"true"<<endl;
	else
		cout<<"false"<<endl;
}

 

在网上搜了下,这段代码是可行的,贴出来进行比较,这段代码是寻找与模式匹配字符串一致的起始位位置,类似于搜索:

http://m.blog.csdn.net/blog/kangroger_11109/22610391

#include<iostream>
using namespace std;
int find(char *substr,int start1,char *str,int start2)
{
	int length1=strlen(substr);//子串长度
	int length2=strlen(str);//母串长度
	int result=-1;//最终要返回的结果
	int current;
	for(int i=start2;i<=length2;i++)//start2为母串搜索的其实位置
	{
		if(i==length2+1)//搜索失败
			return -1;
		result=i;
		current=i;
		for(int k=start1;k<=length1;k++)//start1为子串搜索的其实位置
		{
			if(k==length1-1)
				return result;
			if(substr[k]==str[current]||substr[k]==‘?‘)
			{
				current++;
			}
			else if(substr[k]==‘*‘)//遇到*通配符,代表任何一个或者多个或者0个字符
			{
				if(-1==find(substr,k+1,str,current))
				return -1;
				else return result;
			}
			else break;
		}
	}
}
int main()
{
	char *substr=(char*)malloc(21*sizeof(char));
	char *str=(char*)malloc(21*sizeof(char));
	cin>>substr;
	cin>>str;
	cout<<find(substr,0,str,0);
	return 0;
}

 

(1)我一开始的思路并未使用到递归的思想,而且一找到与第一个与模式字符*后第一个字母匹配的字符后,就不考虑后面还有匹配的情况,导致如果第二个字母不匹配,就直接返回不匹配。在我设计的算法当中,无法规避这个情况。下一段代码在一个for循环当中,把匹配字符的所有字符都遍历一遍。内层for是匹配当前模式字符串,当有匹配字符时,即进入 。一旦某次匹配不成功,即跳出内层for循环。继续外层for循环,重新开始寻找下一个匹配的地方。

(2)应该以匹配字符为主循环,我的却是以模式字符串为主循环。

结合以上思路,还需要改进,才能运用到当前华为的oj中。

打算在我写好的程序上进行修改,简单来说,就是在发现"*"字符串后,加一个for,把后面的都轮一遍,(递归),如果for循环一轮后,没有找到,返回false。

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int IsMatch(string rule,string sub)
{
	int k=0;
	int c=0;
	while(k<rule.length()&&c<sub.length())
	{
                //改进部分
		if(rule[k]==‘#‘||sub[c]==‘#‘)
		{
			if(rule[k]==‘#‘&& sub[c]==‘#‘)
				return 1;
			else
				return 0;
		}
              //改进部分^

		if(rule[k]==‘?‘)
		{
			++k;
			++c;
			continue;
		}

		if(rule[k]==‘*‘)
		{
                     //改进部分
			for(int n=c;n<sub.length();n++)
			{
				if(IsMatch(rule.substr(k+1),sub.substr(n)))
					return 1;
			}
			return 0;
                   //改进部分^
		}

		if(rule[k]!=sub[c])
			return 0;

	    ++k;
		++c;
	}
}

string ToLower(string ss)
{
	string::iterator itr;
	for(itr=ss.begin();itr!=ss.end();itr++)
	{
		*itr=tolower(*itr);
	}
	return ss;
}

int main()
{

	string rule,sub;
	cin>>rule>>sub;
	rule=ToLower(rule);
	sub=ToLower(sub);
	rule.append("#");
	sub.append("#");
	if(IsMatch(rule,sub))
		cout<<"true"<<endl;
	else
		cout<<"false"<<endl;
}

  

时间: 2024-10-21 03:31:40

[华为oj]字符串通配符的相关文章

华为OJ:字符串反转

很简单,逆向输出就好了. import java.util.Scanner; public class convertString { public static void main(String args[]){ Scanner input=new Scanner(System.in); String s=input.nextLine(); StringBuffer l=new StringBuffer(); for(int i=s.length()-1;i>=0;i--){ l.append

华为OJ——字符串加密

题目描述 有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙.下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS.如果单词中包含有重复的字母,只保留第1个,其余几个丢弃.现在,修改过的那个单词死于字母表的下面,如下所示: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z T R A I L B Z E S C D F G H J K M N O P Q U V W X Y 上面其他用字母表中剩余的字母填充完整.在

华为OJ—字符串排序

http://career-oj.huawei.com/exam/ShowProblemInfo?id=2168 编写一个程序,将输入字符串中的字符按如下规则排序. 规则1:英文字母从A到Z排列,不区分大小写. 如,输入:Type 输出:epTy 规则2:同一个英文字母的大小写同时存在时,按照输入顺序排列. 如,输入:BabA 输出:aABb 规则3:非英文字母的其它字符保持原来的位置. 如,输入:By?e 输出:Be?y 样例: 输入: A Famous Saying: Much Ado Ab

华为OJ——字符串合并处理

题目描述 按照指定规则对输入的字符串进行处理. 详细描述: 将输入的两个字符串合并. 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序.这里的下标意思是字符在字符串中的位置. 对排训后的字符串进行操作,如果字符为'0'--'9'或者'A'--'F'或者'a'--'f',则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符.如字符为'4',为0100b,则翻转后为0010b,也就是2.转换后的字符为'2': 如字符为'7',为0111b,则翻

华为OJ 字符串排序

写完之后,总觉得有点复杂.. 要求: 编写一个程序,将输入字符串中的字符按如下规则排序. 规则1:英文字母从A到Z排列,不区分大小写. 如,输入:Type输出:epTy 规则2:同一个英文字母的大小写同时存在时,按照输入顺序排列. 如,输入:BabA输出:aABb 规则3:非英文字母的其它字符保持原来的位置. 如,输入:By?e输出:Be?y 样例: 输入: A Famous Saying: Much Ado About Nothing(2012/8). 输出: A aaAAbc dFgghh:

华为OJ平台——字符串通配符

题目描述: 在计算机中,通配符一种特殊语法,广泛应用于文件搜索.数据库.正则表达式等领域.现要求各位实现字符串通配符的算法.要求:实现如下2个通配符: *:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写.下同)(不包含. , 等特殊字符) ?:匹配1个字符 输入 通配符表达式: 一组字符串. 输出 返回匹配的结果,正确输出true,错误输出false 思路: 分三种情况: (1)无通配符的情况:对应的字符要完全相等,否则匹配失败,输出false (2)通配符为?的情况:对应的

【华为OJ】【082-字符串通配符】

[华为OJ][算法总篇章] [华为OJ][082-字符串通配符] [工程下载] 题目描述 问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索.数据库.正则表达式等领域.现要求各位实现字符串通配符的算法. 要求: 实现如下2个通配符: *:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写.下同) ?:匹配1个字符 输入描述 通配符表达式: 一组字符串. 输出描述 返回匹配的结果,正确输出true,错误输出false 输入例子 先输入一个带有通配符的字符串,再输入一个需要

华为OJ:2290 字符串最后一个单词的长度

用JAVA就很简单,只要用spilt函数,再输出最后一个字符串. 题意是要求你先自己写分隔好字符串这样子.有个比较坑的地方就是测试用例应该有个全为空的,要注意. import java.util.Scanner; public class Main { public static void main(String args[]){ Scanner input=new Scanner(System.in); String s=input.nextLine(); String ss[]=s.spli

【华为OJ】【083-计算字符串的相似度】

[华为OJ][算法总篇章] [华为OJ][083-计算字符串的相似度] [工程下载] 题目描述 对于不同的字符串,我们希望能有办法判断相似程度,我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法如下: 1 修改一个字符,如把"a"替换为"b". 2 增加一个字符,如把"abdd"变为"aebdd". 3 删除一个字符,如把"travelling"变为"traveling"