首页 > 试题广场 >

字符串匹配

[编程题]字符串匹配
  • 热度指数:12272 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
读入数据string[ ],然后读入一个短字符串。要求查找string[ ]中和短字符串的所有匹配,输出行号、匹配字符串。匹配时不区分大小写,并且可以有多个用中括号表示的模式匹配。如“aa[123]bb”,就是说aa1bb、aa2bb、aa3bb都算匹配。

输入描述:
输入有多组数据。
每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(不含空格),接下来输入一个匹配字符串。


输出描述:
输出匹配到的字符串的行号和该字符串(匹配时不区分大小写)。
示例1

输入

4
Aab
a2B
ab
ABB
a[a2b]b

输出

1 Aab
2 a2B
4 ABB
Java

import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            int n = scanner.nextInt();
            ArrayList<String> list = new ArrayList<>();
            for (int i = 0; i < n; i++) list.add(scanner.next());
            String r = scanner.next().toLowerCase();
            for (int i = 0; i < list.size(); i++) {
                if (Pattern.matches(r,list.get(i).toLowerCase()))
                    System.out.println(i+1+" "+list.get(i));
            }
        }
    }
}




编辑于 2020-03-20 10:52:20 回复(0)
//坑爹,判断有无输入要用sc.hasNextInt()
//而且接收字符串要用sc.next()(而不是sc.nextLine())
//第一个会报类型不匹配,第二个在688个的用例情况下会不通过.
import java.util.Scanner;
import java.util.regex.Pattern;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNextInt()){
            int n=sc.nextInt();
            String[] arr=new String[n+1];
            for(int i=1;i<n+1;i++){
                arr[i]=sc.next().trim();
            }
            String regex=sc.next().trim().toLowerCase();
            Pattern p=Pattern.compile(regex);
            for(int i=1;i<n+1;i++){
                String s=arr[i];
                if(p.matcher(s.toLowerCase()).matches()){
                    System.out.println(i+" "+arr[i]);
                }
            }
        }
    }
}

发表于 2018-09-20 17:24:51 回复(0)

这是能够AC的代码,思路来自@nlxx (我不过是重新排版了下)值得注意的是:str和tar的Scanner获取 不能是nextLine() 应该是next()

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.regex.Pattern;
/**
* @author Allen_Hua
* @create_time May 16, 2018 8:58:27 AM
*/
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            int n = scan.nextInt();// 行数
            Map map = new HashMap();
            for (int i = 0; i < n; i++) {
                String str = scan.next();
                map.put(i + 1, str);
            }
            String tar = scan.next();// 短目标字符串
            // 模式匹配
            for (Map.Entry entry : map.entrySet()) {
                Integer key = entry.getKey();
                String value = entry.getValue();
                boolean judge = Pattern.compile(tar, Pattern.CASE_INSENSITIVE).matcher(value).find();
                if (judge) {
                    System.out.println(key + " " + value);
                }
            }
        }
    }
}

不知道为撒子我下面的代码也是遇到了688case无法通过的问题,恳请路过的大神帮忙分析一下,哪里疏忽了未考虑到?我在本地IDE上跑的没问题呀

import java.util.Scanner;
public class Main {
    public static void main(String[] args) throws NullPointerException {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            int n = scan.nextInt();
            String[] arr = new String[n];//输入的字符串数组
            for (int i = 0; i < arr.length; i++) {
                arr[i] = scan.next();
            }
            String tar = scan.next();// 目标字符串
            deal(tar, arr);//处理问题方法
        }
    }
    /**
     * 传进来目标字符串tar
     * 需要处理的字符串数组arr
     *
     * @param tar
     * @param arr
     */
    private static void deal(String tar, String[] arr) {
        // TODO Auto-generated method stub
        //如果包含 [ ] 则构造匹配的各个字符串和arr比较
        if (tar.contains("[") && tar.contains("]")) {
            int left = tar.indexOf("[");
            int right = tar.indexOf("]");
            String newStr = tar.substring(left + 1, right);//获得中括号之间的字符串
            String[] matchStr = new String[right - left - 1];//中括号之间的字符串个数 构造该个数的字符串数组
            String[] candidate = new String[newStr.length()];//临时保存sb内容
            for (int i = 0; i < newStr.length(); i++) {
                char pipei = newStr.charAt(i);
                StringBuffer sb = new StringBuffer();
                sb.append(tar.substring(0, left));
                sb.append(pipei);
                sb.append(tar.substring(right + 1));
                candidate[i] = sb.toString();
            }
            for (int i = 0; i < arr.length; i++) {
                String cmp1 = arr[i];
                for (int j = 0; j < candidate.length; j++) {
                    String cmp2 = candidate[j];
                    if (cmp1.compareToIgnoreCase(cmp2) == 0) {
                        System.out.println((i + 1) + " " + cmp1);
                    }
                }
            }
        }
        else {//不包含 [ ]
            for (int i = 0; i < arr.length; i++) {
                String cmp1 = arr[i];
                if (cmp1.compareToIgnoreCase(tar) == 0) {
                    System.out.println((i + 1) + " " + cmp1);
                }
            }
        }
    }
}
编辑于 2018-05-16 09:12:44 回复(3)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        while ((line = input.readLine()) != null) {
            int n=Integer.parseInt(line);
            String str[]=new String[n];
            for(int i=0;i<n;i++){
                str[i]=input.readLine();
            }
            String pattern=input.readLine().toLowerCase();
            for(int i=0;i<n;i++){
                if(str[i].toLowerCase().matches(pattern)){
                    System.out.println(i+1+" "+str[i]);
                }
            }

        }
        input.close();
    }
}
发表于 2018-05-10 10:56:35 回复(0)

import java.util.*;


publicclass match {

public static void main(String[] args){

@SuppressWarnings( "resource" )

Scanner in=new Scanner(System.in);

while(in.hasNext()){

int n=in.nextInt();

String[] ss=new String[n];

for(int i=1;i<=n;i++){

ss[i-1]=in.next();

}

String reg=in.next();

for(int i=0;i<n;i++){

reg="(?i)"+reg;

if(ss[i].matches(reg))

System.out.println((i+1)+" "+ss[i]);

}

}

}

}

编辑于 2017-01-26 21:50:12 回复(1)