题目描述:

在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下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平台——字符串通配符的更多相关文章

  1. 华为OJ平台——字符串分隔

    题目描述: 连续输入字符串,请按长度为8拆分每个字符创 后输出到新的字符串数组: 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理 输入 连续输入字符串(输入两次,每个字符长长度小于100)输 ...

  2. 华为OJ平台——输出最小的k个数

    输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int *pInputArray, unsignedint ...

  3. 华为OJ平台——矩阵乘法

    题目描述: 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C. 输入: 1.第一个矩阵的行数 2.第一个矩阵的列数(也是第二个矩阵的行数) 3.第二个矩阵 ...

  4. 华为OJ平台——统计字符串中的大写字母

    题目描述: 统计字符串中的大写字母的个数 输入: 一行字符串 输出: 字符串中大写字母的个数(当空串时输出0) 思路: 这一题很简单,直接判断字符串中的每一个字符即可,唯一要注意的一点是输入的字符串可 ...

  5. 华为OJ平台——计算字符串的相似度

    题目描述: 对于不同的字符串,我们希望能有办法判断相似程度,我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法如下: 1 修改一个字符,如把“a”替换为“b”. 2 增加一个字符,如 ...

  6. 华为OJ平台——密码强度等级

    题目描述: 密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分. 一.密码长度: 5 分: 小于等于4 个字符 10 分: 5 到7 字符 25 分: 大于等于8 个字符 二.字母: 0  ...

  7. 华为OJ平台——字符串匹配

    题目描述: 判断短字符串中的所有字符是否在长字符串中全部出现 输入: 输入两个字符串. 第一个为短字符,第二个为长字符 输出: true  - 表示短字符串中所有字符均在长字符串中出现 false - ...

  8. 华为OJ平台——整形数组合并

    题目描述: 将两个整型数组按照升序合并,并且过滤掉重复数组元素 输入: 输入说明,按下列顺序输入: 1 输入第一个数组的个数 2 输入第一个数组的数值 3 输入第二个数组的个数 4 输入第二个数组的数 ...

  9. 华为OJ平台——超长正整数相加

    题目描述: 请设计一个算法完成两个超长正整数的加法. 输入 输入两个字符串数字 输出 输出相加后的结果,string型 样例输入 99999999999999999999999999999999999 ...

随机推荐

  1. Linux从逻辑地址到物理地址

    转自:http://blog.chinaunix.net/uid-24774106-id-3427836.html 我们都知道,动态共享库里面的函数的共享的,这也是动态库的优势所在,就是节省内存.C ...

  2. activiti自定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

  3. 黄聪:阿里云Windows2012服务器IIS8实现wordpress完美伪静态(ISAPIRewritev)

    1.下载64位URL重写组件:http://www.iis.net/downloads/microsoft/url-rewrite   (可以直接下载:urlrewrite2.rar) 2.暂停IIS ...

  4. 嵌入式jetty

    一.maven依赖 pom配置 <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId&g ...

  5. Chrome安装FlashPlayer Debug

    首先: 在谷歌浏览器上打开chrome://plugins 找到 Adobe Flash Player 然后将谷歌自带的版本停用,如果已经安装了for Netscape版,则会显示另外一个版本.(建议 ...

  6. rand()随机数的产生

    #include "stdio.h"#include<stdlib.h>用下列公式即可得到指定范围[m,n]的随机数: r = rand()%(n - m + 1) + ...

  7. fiddle 中 显示serverIp

    1.快捷键Ctrl+R  或者  菜单->Rules->Customize Rules 2.在CustomRules.js文件里Ctrl+F查找字符串 static function Ma ...

  8. 问对于一个给定的n,怎样才能用最少的步骤将它变到1

    如果n为偶数,则将它除以2,如果n为奇数,则将它加1或者减1.问对于一个给定的n,怎样才能用最少的步骤将它变到1.例如:n= 61n-- 60n/2 30n/2 15n++ 16n/2 8n/2 4n ...

  9. sql2008连接数据库问题

    配置系统未能初始化 (System.Configuration) ------------------------------ 无法识别的配置节 runtime. (C:\Program Files ...

  10. 更新nvm

    在官方看到这个文档 ( cd "$NVM_DIR" git fetch origin git checkout `git describe --abbrev=0 --tags -- ...