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

题目描述:

在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下2个通配符:
  *:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同)(不包含. , 等特殊字符
  ?:匹配1个字符

输入
  通配符表达式;
  一组字符串。

输出
  返回匹配的结果,正确输出true,错误输出false

思路:

分三种情况:

(1)无通配符的情况:对应的字符要完全相等,否则匹配失败,输出false

(2)通配符为?的情况:对应的一个字符是字母(不区分大小写)或数字,否则匹配失败,输出false

(3)通配符为*的情况:匹配字符串中下一个非字母和数字的字符必须与*后的字符相同,否则匹配失败,输出false

如果最后经过循环后没有false输出,则表明匹配成功,输出true

  1 import java.util.Scanner;
  2
  3 /**
  4  * 在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。
  5  * 现要求各位实现字符串通配符的算法。
  6  * 要求:
  7  * 实现如下2个通配符:
  8   *   *:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同)
  9    *   ?:匹配1个字符
 10  *
 11  * 输入
 12  *         通配符表达式;
 13  *         一组字符串。
 14  * 输出
 15  *         返回匹配的结果,正确输出true,错误输出false
 16  *
 17  */
 18 public class StringMatch {
 19
 20     public static void main(String[] args) {
 21         //输入,读入两行字符
 22         Scanner cin = new Scanner(System.in) ;
 23         String str = cin.nextLine() ;
 24         String strMatch = cin.nextLine() ;
 25         cin.close();
 26
 27         int len = str.length() ;
 28         int lenMatch = strMatch.length() ;
 29         int i = 0 ;
 30         int j = 0 ;
 31
 32         char temp ;
 33         //循环比较,判断条件是当任一个到达字符串尾时结束循环
 34         while(i < len && j < lenMatch ){
 35             /*
 36              * 分三种情况:
 37              *     (1)无通配符的情况:对应的字符要完全相等,否则匹配失败,输出false
 38              *     (2)通配符为?的情况:对应的一个字符是字母(不区分大小写)或数字,
 39              *         否则匹配失败,输出false
 40              *     (3)通配符为*的情况:匹配字符串中下一个非字母和数字的字符必须与*后的字符相同,
 41              *         否则匹配失败,输出false
 42              * 如果最后经过循环后没有false输出,则表明匹配成功,输出true
 43              */
 44             if(str.charAt(i) != ‘*‘ && str.charAt(i) != ‘?‘ ){
 45                 //(1)无通配符的情况
 46                 if(str.charAt(i) != strMatch.charAt(j)){
 47                     //匹配失败,输出false
 48                     System.out.println("false");
 49                     return ;
 50                 }else{
 51                     //匹配成功,进入各自下一个字符的匹配
 52                     i++ ;
 53                     j++ ;
 54                     continue ;
 55                 }
 56             }else if(str.charAt(i) == ‘?‘){
 57                 //(2)通配符为?的情况
 58                 temp = strMatch.charAt(j) ;
 59                 if(       (temp >= ‘a‘ && temp <= ‘z‘)
 60                     || (temp >= ‘A‘ && temp <= ‘Z‘)
 61                     || (temp >= ‘0‘ && temp <= ‘9‘)){
 62                     //匹配成功,进入各自下一个字符的匹配
 63                     i++ ;
 64                     j++ ;
 65                     continue ;
 66                 }else{
 67                     //匹配失败,输出false
 68                     System.out.println("false");
 69                     return ;
 70                 }
 71             }else{
 72                 //(3)通配符为*的情况
 73                 temp = strMatch.charAt(j) ;
 74                 if(       (temp >= ‘a‘ && temp <= ‘z‘)
 75                     || (temp >= ‘A‘ && temp <= ‘Z‘)
 76                     || (temp >= ‘0‘ && temp <= ‘9‘)){
 77                     //strMatch的当前字符匹配成功,进入strMatch的下一个字符的匹配
 78                     j++ ;
 79                     continue ;
 80                 }else{
 81                     //匹配字符串中下一个非字母和数字的字符必须与*后的字符相同,
 82                     //表明StrMatch的当前字符为非数字、字母的字符,必须匹配str中*后一个字符
 83                     if(i == (len-1)){
 84                         //如果str中*是最后一个,则匹配失败,输出false
 85                         System.out.println("false");
 86                         return ;
 87                     }else{
 88                         //如果str中*不是最后一个,则继续str中的下一个,继续匹配
 89                         i++ ;
 90                         continue ;
 91                     }
 92                 }
 93             }
 94         }
 95
 96         System.out.println("true");
 97         return ;
 98     }
 99
100 }

时间: 2024-12-12 15:28:42

华为OJ平台——字符串通配符的相关文章

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

题目描述: 连续输入字符串,请按长度为8拆分每个字符创 后输出到新的字符串数组: 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理 输入 连续输入字符串(输入两次,每个字符长长度小于100)输出 输出到长度为8,的新字符串数组样例输入 abc 123456789样例输出 abc00000 12345678 90000000 思路: 都是直接处理,没有具体的方法而言 注意点: 华为的OJ平台的输入输出有点坑,好多次的程序都在这里出问题,在Eclipse上运行的结果没问题,然后在OJ上就是编

华为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平台——矩阵乘法

题目描述: 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C. 输入: 1.第一个矩阵的行数 2.第一个矩阵的列数(也是第二个矩阵的行数) 3.第二个矩阵的列数 4.第一个矩阵的值 5.第二个矩阵的值 输出: 输出两个矩阵相乘的结果 样例输入 2 2 2 3 8 8 0 9 0 18 9 样例输出 171 72 72 0 思路: 题目意思很简单,只是实现两个矩阵乘法功能,要注意的一点是输出的格式. OJ平台中对输出的格式非常严格,经过多次尝试,验证此

华为OJ平台试题 —— 数组:字符串反转

字符串反转 代码: /* * 接受一个字符串,然后输出该字符串反转后的字符串. */ #include <stdio.h> #include <string.h> /* * 字符串反转函数 */ char *revstr(char *str, int len) { char *start = str; char *end = str + len - 1; char ch; if (str != NULL) { while (start < end) { ch = *start

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

题目描述: 统计字符串中的大写字母的个数 输入: 一行字符串 输出: 字符串中大写字母的个数(当空串时输出0) 思路: 这一题很简单,直接判断字符串中的每一个字符即可,唯一要注意的一点是输入的字符串可能包含空格,所以读入的时候要用nextLine()方法 1 import java.util.Scanner; 2 3 public class CountCaptial { 4 5 public static void main(String[] args) { 6 Scanner cin = n

【华为OJ平台练习题】统计一段字符串中含有空格、英文、数字的个数

//统计一段字符串中含有空格.英文.数字的个数 #include <iostream> using namespace std; void processString(char* s) { int n = strlen(s); int kg=0; int shuzi=0; int yingwen=0; if(n>0) { for(int a=0;a<n;a++) { if(s[a]==' ') kg++; if(s[a]<='9'&&s[a]>='0')

华为OJ平台试题 —— 字符串:名字的漂亮度

<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255);">1.名字的漂亮度</span> 代码: <pre name="code" class="cpp"> #include<stdio.h> /* * 对数组a 进行排序 */ voi

华为OJ平台试题 ——字符串:输出数组中重复的数组

<pre name="code" class="cpp">/* * 题目:输出数组中重复出现的数组(0-9) * * 输入:输入一串数字,中间以逗号隔开,如3,2,2,3,5,6,7,8,9 * 输出:输出数组中重复出现的数字(数字间以空格隔开),输出顺序按原数组中的先后顺序,输出3,2 */ #include<stdio.h> #include<string.h> #define N 256 /* * 定义一个结构体:数字和数字

华为OJ:字符串合并处理

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