华为OJ平台——字符串通配符
题目描述:
在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下2个通配符:
*:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同)(不包含. , 等特殊字符)
?:匹配1个字符
输入
通配符表达式;
一组字符串。
输出
返回匹配的结果,正确输出true,错误输出false
思路:
分三种情况:
(1)无通配符的情况:对应的字符要完全相等,否则匹配失败,输出false
(2)通配符为?的情况:对应的一个字符是字母(不区分大小写)或数字,否则匹配失败,输出false
(3)通配符为*的情况:匹配字符串中下一个非字母和数字的字符必须与*后的字符相同,否则匹配失败,输出false
如果最后经过循环后没有false输出,则表明匹配成功,输出true
import java.util.Scanner; /**
* 在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。
* 现要求各位实现字符串通配符的算法。
* 要求:
* 实现如下2个通配符:
* *:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同)
* ?:匹配1个字符
*
* 输入
* 通配符表达式;
* 一组字符串。
* 输出
* 返回匹配的结果,正确输出true,错误输出false
*
*/
public class StringMatch { public static void main(String[] args) {
//输入,读入两行字符
Scanner cin = new Scanner(System.in) ;
String str = cin.nextLine() ;
String strMatch = cin.nextLine() ;
cin.close(); int len = str.length() ;
int lenMatch = strMatch.length() ;
int i = 0 ;
int j = 0 ; char temp ;
//循环比较,判断条件是当任一个到达字符串尾时结束循环
while(i < len && j < lenMatch ){
/*
* 分三种情况:
* (1)无通配符的情况:对应的字符要完全相等,否则匹配失败,输出false
* (2)通配符为?的情况:对应的一个字符是字母(不区分大小写)或数字,
* 否则匹配失败,输出false
* (3)通配符为*的情况:匹配字符串中下一个非字母和数字的字符必须与*后的字符相同,
* 否则匹配失败,输出false
* 如果最后经过循环后没有false输出,则表明匹配成功,输出true
*/
if(str.charAt(i) != '*' && str.charAt(i) != '?' ){
//(1)无通配符的情况
if(str.charAt(i) != strMatch.charAt(j)){
//匹配失败,输出false
System.out.println("false");
return ;
}else{
//匹配成功,进入各自下一个字符的匹配
i++ ;
j++ ;
continue ;
}
}else if(str.charAt(i) == '?'){
//(2)通配符为?的情况
temp = strMatch.charAt(j) ;
if( (temp >= 'a' && temp <= 'z')
|| (temp >= 'A' && temp <= 'Z')
|| (temp >= '0' && temp <= '9')){
//匹配成功,进入各自下一个字符的匹配
i++ ;
j++ ;
continue ;
}else{
//匹配失败,输出false
System.out.println("false");
return ;
}
}else{
//(3)通配符为*的情况
temp = strMatch.charAt(j) ;
if( (temp >= 'a' && temp <= 'z')
|| (temp >= 'A' && temp <= 'Z')
|| (temp >= '0' && temp <= '9')){
//strMatch的当前字符匹配成功,进入strMatch的下一个字符的匹配
j++ ;
continue ;
}else{
//匹配字符串中下一个非字母和数字的字符必须与*后的字符相同,
//表明StrMatch的当前字符为非数字、字母的字符,必须匹配str中*后一个字符
if(i == (len-1)){
//如果str中*是最后一个,则匹配失败,输出false
System.out.println("false");
return ;
}else{
//如果str中*不是最后一个,则继续str中的下一个,继续匹配
i++ ;
continue ;
}
}
}
} System.out.println("true");
return ;
} }
华为OJ平台——字符串通配符的更多相关文章
- 华为OJ平台——字符串分隔
题目描述: 连续输入字符串,请按长度为8拆分每个字符创 后输出到新的字符串数组: 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理 输入 连续输入字符串(输入两次,每个字符长长度小于100)输 ...
- 华为OJ平台——输出最小的k个数
输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int *pInputArray, unsignedint ...
- 华为OJ平台——矩阵乘法
题目描述: 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C. 输入: 1.第一个矩阵的行数 2.第一个矩阵的列数(也是第二个矩阵的行数) 3.第二个矩阵 ...
- 华为OJ平台——统计字符串中的大写字母
题目描述: 统计字符串中的大写字母的个数 输入: 一行字符串 输出: 字符串中大写字母的个数(当空串时输出0) 思路: 这一题很简单,直接判断字符串中的每一个字符即可,唯一要注意的一点是输入的字符串可 ...
- 华为OJ平台——计算字符串的相似度
题目描述: 对于不同的字符串,我们希望能有办法判断相似程度,我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法如下: 1 修改一个字符,如把“a”替换为“b”. 2 增加一个字符,如 ...
- 华为OJ平台——密码强度等级
题目描述: 密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分. 一.密码长度: 5 分: 小于等于4 个字符 10 分: 5 到7 字符 25 分: 大于等于8 个字符 二.字母: 0 ...
- 华为OJ平台——字符串匹配
题目描述: 判断短字符串中的所有字符是否在长字符串中全部出现 输入: 输入两个字符串. 第一个为短字符,第二个为长字符 输出: true - 表示短字符串中所有字符均在长字符串中出现 false - ...
- 华为OJ平台——整形数组合并
题目描述: 将两个整型数组按照升序合并,并且过滤掉重复数组元素 输入: 输入说明,按下列顺序输入: 1 输入第一个数组的个数 2 输入第一个数组的数值 3 输入第二个数组的个数 4 输入第二个数组的数 ...
- 华为OJ平台——超长正整数相加
题目描述: 请设计一个算法完成两个超长正整数的加法. 输入 输入两个字符串数字 输出 输出相加后的结果,string型 样例输入 99999999999999999999999999999999999 ...
随机推荐
- 109. Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- 【转】一道SQL SERVER DateTime的试题
学习过上一篇SQL SERVER DateTime精度的文章后.再来做一道题. IF ('2011-07-31 00:00:00.000' BETWEEN '2011-07-01' and '2011 ...
- Yii集成smarty说明
1. [在protected目录下建立文件夹vendor/smarty,把smarty的类包放入其中] 2. [在extensions目录下边建立文件CSmarty.php] ...
- linux内存文件系统之指南
内存文件系统使用及示例:ramdisk, ramfs, tmpfs 第一部分在Linux中可以将一部分内存mount为分区来使用,通常称之为RamDisk. RamDisk有三种实现方式: 第一种就是 ...
- 一个SQLSERVER触发器的示例
CREATE TRIGGER WoStateChange on T_PD_WorkOrder AFTER UPDATE AS BEGIN declare @WorkOrderID varchar(20 ...
- Mongodb(3)插入文档,更新文档,删除文档
insert() 方法 要插入数据到 MongoDB 集合,需要使用 MongoDB 的 insert() 或 save() 方法. 插入文档:db.COLLECTION_NAME.insert(d ...
- java 编译中没有清除之前编译出来的文件。
最近在写一个类时候使用了内部类,然后又将这个类改用普通类来实现.但在运行时访问局部变量时候出现了NullPointException异常,想来想去没有想明白,后来清除了一个之前编译出来的文件*.cla ...
- StringIO 模块用于在内存缓冲区中读写数据
模块是用类编写的,只有一个StringIO类,所以它的可用方法都在类中.此类中的大部分函数都与对文件的操作方法类似. 例: #coding=gbk import StringIO s=StringIO ...
- iOS 加入自定义字体方法
1.网上搜索字体文件(后缀名为.ttf,或.odf) 2.把字体库导入到工程的resouce中 3.在程序添加以下代码 输出所有字体 NSArray *familyNames = [UIFont fa ...
- async callback z
public class StackOverflow_5979252 { [ServiceContract(Name = "IMessageCallback")] public i ...