Java创意标题匹配问题 | 豆包MarsCode AI刷题

69 阅读3分钟

题目

创意标题匹配问题
问题描述

在广告平台中,为了给广告主一定的自由性和效率,允许广告主在创造标题的时候以通配符的方式进行创意提交。线上服务的时候,会根据用户的搜索词触发的 bidword 对创意中的通配符(通配符是用成对 {} 括起来的字符串,可以包含 0 个或者多个字符)进行替换,用来提升广告投放体验。例如:“{末日血战} 上线送 SSR 英雄,三天集齐无敌阵容!”,会被替换成“帝国时代游戏下载上线送 SSR 英雄,三天集齐无敌阵容!”。给定一个含有通配符的创意和n个标题,判断这句标题是否从该创意替换生成的。

测试样例

样例1

输入:`n = 4, template = "ad{xyz}cdc{y}f{x}e", titles = ["adcdcefdfeffe", "adcdcefdfeff", "dcdcefdfeffe", "adcdcfe"]`  
输出:`"True,False,False,True"`

样例2

输入:`n = 3, template = "a{bdc}efg", titles = ["abcdefg", "abefg", "efg"]`  
输出:`"True,True,False"`

样例3

输入:`n = 5, template = "{abc}xyz{def}", titles = ["xyzdef", "abcdef", "abxyzdef", "xyz", "abxyz"]`  
输出:`"True,False,True,True,True"`

思路解析

  1. 使用正则表达式里的“.*”代替题目中的“{}”,以此判断titles里的字符串是否满足要求
  2. 遍历titles字符串,满足要求ans+“True,”,否则ans+“False,”
  3. ans去掉最后一个字符“,”,并返回
正则表达式

java.util.regex  包是 Java 标准库中用于支持正则表达式操作的包。

  • Pattern 类: pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。

在这里用到Pattern.matches(pattern,content)这个方法,其中pattern是正则表达式,content是需要判断的字符串

示例

Pattern.matches(ad.*cdc.*f.*e,adcdcefdfeff)的值是false,".*"代表的是任意内容,与题目中的{}意义相符合

Java代码

package Re;

import java.util.regex.Pattern;	//导入Java标准库中用于支持正则表达式操作的包

public class r 
{
	public static boolean judge(String temp,String title) //判断字符是否满足条件
	{
		String pattern = "";					//正则表达式
		for(int i=0;i<temp.length();i++) 		//遍历template字符串
		{
			if(temp.charAt(i)=='{') 			//如果字符为{,跳过,直到字符为},pattern加上.*
			{
				while(temp.charAt(i)!='}'&&i<temp.length())
					i++;
				i++;							//让i指向{的下一位
				pattern = pattern + ".*";
			}
			if(i>=temp.length()) break;			//判断是否溢出,若溢出则结束循环
			pattern = pattern + temp.charAt(i);	//{}外的字符添加到pattern
		}
		//System.out.println(pattern);
		boolean isMatch = Pattern.matches(pattern, title);	//判断字符串是否满足条件
		return isMatch;										//返回结果
	}
	public static String solution(int n, String template_, String[] titles) 
	{
		String ans = "";					//存放结果的字符串
		for(int i=0;i<n;i++) 				//遍历titles
		{
			if(judge(template_,titles[i])) 	
				ans = ans + "True,";		//字符串满足条件则添加True,
			else ans = ans + "False,";		//否则添加False,
		}
		ans = ans.substring(0,ans.length()-1);	//ans舍弃最后一位多余的“,”
		return ans;
    }

    public static void main(String[] args) 
    {
        String[] testTitles1 = {"adcdcefdfeffe", "adcdcefdfeff", "dcdcefdfeffe", "adcdcfe"};
        String[] testTitles2 = {"CLSomGhcQNvFuzENTAMLCqxBdj", "CLSomNvFuXTASzENTAMLCqxBdj", "CLSomFuXTASzExBdj", "CLSoQNvFuMLCqxBdj", "SovFuXTASzENTAMLCq", "mGhcQNvFuXTASzENTAMLCqx"};
        String[] testTitles3 = {"abcdefg", "abefg", "efg"};

        System.out.println(solution(4, "ad{xyz}cdc{y}f{x}e", testTitles1).equals("True,False,False,True"));
        System.out.println(solution(6, "{xxx}h{cQ}N{vF}u{XTA}S{NTA}MLCq{yyy}", testTitles2).equals("False,False,False,False,False,True"));
        System.out.println(solution(3, "a{bdc}efg", testTitles3).equals("True,True,False"));
    }

}