编程题:最大字符串匹配

目录

  • 简介
  • 题目介绍
  • 思路
  • 代码及结果

简介

该题目为博主在面试中碰到的,因为觉得挺有意思故放上来以作留存记录。

题目介绍

求解给定字符串的最大匹配字符串。分两次输入,如输入"mynameiszhangsan"和"mynameislisi",结果输出"myname"

思路

题目的介绍其实很简单,但实现的过程还是稍微有点复杂,因为如果光考虑到匹配的问题,那么一个简单的数组匹配就能解决,但现在要求求最大匹配字符串,则在输入的字符串中要进行多次匹配,并且匹配次数不固定,相关的思路我代码中都有写,如有人有所看不懂的疑问请在评论区打出,我会抽出时间来做一个图解详细描述我的思路过程。

代码及结果

package 最大字符串匹配;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class test{
     //最大匹配字符串
	public static void main(String args[]) {
     
		Scanner sc = new Scanner(System.in);
		String a = sc.nextLine();
		String b = sc.nextLine();
		char[] x = a.toCharArray();
		char[] y = b.toCharArray();
		int c = x.length;
		int d = y.length;
		int e = Math.min(c, d);
		
		List<Integer> z=new ArrayList<>();//保存相同字符的数组下标
		List<Character> z2=new ArrayList<>();//保存相同字符的数据
		List<Character> z3=new ArrayList<>();//用于保存多次替换的字符数据
		List<Character> z4=new ArrayList<>();//最终要输出的数组数据
		for (int i = 0; i < e; i++) {
     
			if (x[i] == y[i]) {
     
				z2.add(x[i]);
				z.add(i);
			}
		}//将所有相同的匹配字符存入list中,其中z存放字符在list中的位置,z2存放相同的字符。
		int max=0;
		int num=1;//计算最大匹配字符串的长度
		for(int i=0;i<z.size();i++) {
     
			if(num==1) {
     //一串匹配字符的第一个字符的处理方法
				if(z.contains(z.get(i)+1)) {
     
					z3.add(z2.get(i));
					num++;
					if(max<num) {
     
						max=num;
					}
				}
			}else if(num!=1) {
     
				if((z.contains(z.get(i)+1)&&z.contains(z.get(i)-1))||z.contains(z.get(i)-1)) {
     //一串匹配字符的第一个字符以外的处理方法,其中判断条件中的前半段是匹配字符串中非头部和尾部的处理方法,后半段为尾部的处理方法
					z3.add(z2.get(i));
					num++;
					if(max<num) {
     
						max=num;
					}
				}else {
     //z3中所保留的是这一次遍历的匹配字符串长度,故该长度比最终要输出的字符串即z4长的话则进行替换,否则z4继续保留
					if(z4.size()<z3.size()) {
     
						z4.clear();
						for(int j=0;j<z3.size();j++) {
     
							z4.add(z3.get(j));
						}
					}
					z3.clear();
					z3.add(z2.get(i));//此时此次遍历的i还没进入list中故加入list
					num=1;
				}
			}
		}
		if(z4.size()<z3.size()) {
     //设置该部分的目的在于,如果有一段字符串长度直到z2末尾的话则上述替换过程根本不会进行,故在此处运行一次防止上述操作失效
			z4.clear();
			for(int j=0;j<z3.size();j++) {
     
				z4.add(z3.get(j));
			}
		}
//		System.out.println(max);
//		System.out.println(z);
//		System.out.println(z2);
//		System.out.println(z3);
		StringBuilder result = new StringBuilder();
        for (int i = 0; i < z4.size(); i++) {
     
        	result.append(z4.get(i));
        }//将z4的list转为字符串类型输出
		System.out.println(result);
		sc.close();
	}

}

结果:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

你可能感兴趣的:(面试编程)