XTU OJ 1163 查询成绩 (字符串+递归)



查询成绩

Accepted : 52   Submit : 275
Time Limit : 3000 MS   Memory Limit : 65536 KB

题目描述

波波同学是位大四的学生,同时也是一位考研er。为了考上北京邮电大学,他准备了很长时间。不久前,考研成绩终于公布了。波波登陆了成绩查询网站,发现自己密码竟然忘记了!但是幸好,他还记得其中的某些字母。请你判断,他记忆中的字母是否是正确密码的片段。

输入

多组样例,每组样例有两行。第一行为正确密码,第二行为波波记得的密码片段,‘*‘号表示波波不知道的密码片段,可能任意长,也可能为零。每行不超过110字符,首尾不会出现‘*‘。

输出

对于每组样例,能得到正确密码的输出yes,不能的输出no。

样例输入

abcdefg
ab*f
fnoeend
f*ed
ajfneogbb
aj*n*b

样例输出

yes
no
yes

Source

loying

昨天刚开始看到这道题的时候,觉得可以做,开始是想以 * 为分割符,把给的正确密码分成两个字符串,然后再用两个字符串和正确的密码相匹配。后来,队友给了我们一个特殊样例,比如像abcfabfe ab*fe我们按我们的思路就行不通,就换了种思路,队友说可以用最长公共子序列做,然后我们就做后面的题去了,把这道题交给他了,后来他说他的思路也错了,我们做另外一道题也没做出来。。今天看了别人的思路,其实我们按我们那种思路在想一下应该也能够想出来。

思路是这样的,进行递归匹配,分成两种情况,如果当前判断的不是 *,看两个字符串中的字符是不是相等,如果相等就递归查找 x+1,y+1; 如果是 *,这里多个*也当成一个 *处理,然后就看 x位置的字符和y+1位置的字符是否相等,如果想等就递归匹配 x+1,y+2;剩下的就是一些细节的处理了。

下面是ac的代码,参考了别人的,把第一个字符设为*;

#include <cstdio>
#include <cstring>
using namespace std;
char s[120],c[120];
int cmp(int x,int y)
{
    int len1,len2;
    len1=strlen(s);
    len2=strlen(c);
    if((y<len2)&&(x>=len1))  return 0;  //第一个字符串遍历完了,第二个还没完,说明就不匹配
    if(y==len2) return 1;  //第二个遍历完了 说明以及匹配到了
    if(c[y]=='*') 
    {
        while(c[y+1]=='*') y++; //多个* 的情况
        int temp;
        for(int i=x;i<len1;i++)
        {
            if(s[i]==c[y+1])
            {
                temp=cmp(i+1,y+2); //这里y是*的那个位置,所以下一个位置应该是y+2;
                if(temp) return 1;
            }
        }
       return 0;
    }
    else
    {
        if(s[x]!=c[y]) return 0;
        else
            return cmp(x+1,y+1);
    }
}
int main()
{
    while(scanf("%s\n%s",s,c+1)!=EOF)
    {
        c[0]='*';
        puts(cmp(0,0)?"yes":"no");
    }
}

这里的c[0]=‘*‘感觉是个技巧,我把这里改了,感觉思路还是对的,样例也都通过了,但是还是wa;

#include <cstdio>
#include <cstring>
using namespace std;
char s[120],c[120];
int cmp(int x,int y)
{
    int len1,len2;
    len1=strlen(s);
    len2=strlen(c);
    if((y<len2)&&(x>=len1))  return 0;
    if(y==len2) return 1;
    if(c[y]=='*')
    {
        while(c[y+1]=='*') y++;
        int temp;
        for(int i=x;i<len1;i++)
        {
            if(s[i]==c[y+1])
            {
                temp=cmp(i+1,y+2);
                if(temp) return 1;
            }
        }
       return 0;
    }
    else
    {
        if(s[x]!=c[y]) return 0;
        else
            return cmp(x+1,y+1);
    }
}
int main()
{
    while(scanf("%s\n%s",s,c)!=EOF) //这里变成c
    {
        //c[0]='*';就这里改了一下
        puts(cmp(0,0)?"yes":"no");
    }
}

感觉思路也还是那样,就是wa

XTU OJ 1163 查询成绩 (字符串+递归)

时间: 2024-10-09 04:57:39

XTU OJ 1163 查询成绩 (字符串+递归)的相关文章

XTU OJ 1175 Hurry Up(三分法&amp;&amp;穷举法)

 Hurry Up Accepted : 88   Submit : 345 Time Limit : 1000 MS   Memory Limit : 65536 KB Problem Description GG is some what afraid of his MM. Once his MM asks, he will always try his best to rush to their home. Obvious, he can run home in straight li

原 Java学习之Xml系列二:xml按条件查询、xml递归遍历所有元素和属性

xml中加入了几条,为了方便查询时作为示例. 话不多说见代码注释: DTD文件:SwordTypeDefinition.dtd <?xml version="1.0" encoding="UTF-8"?> <!ELEMENT SwordLibrary (Sword*)> <!ELEMENT Sword (SwordName,Price,Attack)> <!ELEMENT SwordName (#PCDATA)> &l

ADO多条件模糊查询防字符串攻击

多条件组合查询使用字符串拼接TSQL语句来实现 1 void Button1_Click(object sender, EventArgs e) 2 { 3 string text = "select *from car"; //最终TSQL语句 4 string endtext = ""; //组合查询末尾部分 5 int num = 0; //记录当前是第几条查询,为了区别前缀是Where还是and 6 bool ok = false; //判断是否有填写查询

nyist oj 37 回文字符串 (动态规划经典)

回文字符串 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串. 输入 第一行给出整数N(0<N<100) 接下来的N行,每行一个字符串,每个字符串长度不超过1000. 输出 每行输出所需添加的最少字符

华为OJ:2199 判断输入字符串中的括号匹配

根据不同的括号有个计数器,在遍历时,当计数器小于0则返回false或者当遍历完后,计数器仍旧不为零,也返回false. import java.util.Scanner; public class bracketsMatch { public static void main(String args[]){ Scanner input=new Scanner(System.in); String s=input.nextLine(); int a=0; int b=0; int c=0; for

组合查询——拼接字符串

首先,什么情况下要用到组合查询呢?总的来说,有两种情况:一是在单个查询中从不同的表返回类似结构的数据:二是对单个表执行多个查询,按单个查询返回数据.在这里,我们说的组合查询是指第二种情况,即要查询的表是固定的,查询条件是不定的并且有多个查询条件. 从例子来看, 例如,输入相应的查询条件 1.教师不等于"0" 2.机器号等于"yang" 两个条件是"与"的关系,我们可以很容易的写出它的sql语句 select * from T_Worklog_In

Sql动态查询拼接字符串的优化

Sql动态查询拼接字符串的优化 最原始的 直接写:string sql="select * from TestTables where 1=1";... 这样的代码效率很低的,这样影响了数据库的索引引用如下所示:private void TestOneMethod()        {             string querySql = "select * from TestTables where 1=1";            if (hasOneCo

完整修改查询、字符串攻击

完整修改查询: 输入要删除的用户名,提示有没有此条数据,如果有而后提示是否确定要删除 添加: using System.Data.SqlClient; 而后: namespace 完整修改查询_字符串攻击 { class Program { static void Main(string[] args) { bool has = false;//判断用输入的数据是否存在,true表示存在,false不存在 Console.Write("请输入要删除的用户名:"); string una

sdut oj 1163 C语言实验——排列 (当初不会递归生成排列,这个题目现在才补上 刘汝佳给出了写法 *【模板】 当然有生成全排列的函数存在 )

C语言实验——排列 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 有4个互不相同的数字,请按序输出由其中三个不重复数字组成的排列. 输入 4个整数. 输出 所有排列,输出顺序见样例. 示例输入 1 2 3 4 示例输出 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 1 2 4 1 4 2 2 1 4 2 4 1 4 1 2 4 2 1 1 3 4 1 4 3 3 1 4 3 4 1 4 1 3 4