FZU 2183 简单题(字符串匹配|字符串压缩)(简单)

Problem 2183 简单题

Accept: 138    Submit: 641

Time Limit: 1000 mSec    Memory Limit : 32768 KB

 Problem Description

现在有一些被简单压缩的字符串,例如:a[120]代表120个a。对于字符串acb[3]d[5]e相对于acbbbddddde

现在给你两个字符串cString, nString.一个是被压缩过的字符串,另一个没有被压缩。

求nString是否为cString的子串,如果是输出True,否则输出False.cString的长度clen的范围是0<clen<1000, nString的长度的nlen的范围是0<nlen<1000;cString只包含小写26个字母,[],数字(大于0小于10^9)。nString只包含小写26个字母。

 Sample Input

acb[3]d[5]ebd

 Sample Output

True

思路:

直接暴力就可以,但是要注意的是每个位置记录字母的类型和数量然后直接暴力就可以了。但是要注意c[3]c[5]这种数据。

代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include<iostream>
using namespace std;
#define N 1005
typedef long long ll;
struct C{
    int cnt;
    char ch;
};
C A[N], B[N];
int main()
{
    while (1)
    {
        for (int i = 0; i < N; i++)
        {
            A[i].cnt = 1;
        }
        char temp, t = ' ';
        int cnt1 = -1, cnt2 = -1;
        while (scanf("%c", &temp), temp != '\n')
        {
            if (t == temp) A[cnt1].cnt++;
            else if (temp != '[' && t != temp)
            {
                cnt1++;
            }

            if (temp >= 'a' && temp <= 'z')
            {
                A[cnt1].ch = temp;
                t = temp;
            }
            if (temp == '[')
            {
                int num;
                scanf("%d%*c", &num);
                A[cnt1].cnt = num;
            }
        }
        t = ' ';
        while (scanf("%c", &temp), temp != '\n')
        {
            if (temp >= 'a' && temp <= 'z' && temp != t)
            {
                B[++cnt2].ch = temp;
                B[cnt2].cnt = 1;
                t = temp;
            }
            else if (temp == t)
            {
                B[cnt2].cnt++;
            }
        }
    /*
    for(int i=0;i<=cnt1;i++)
    cout<<A[i].ch<<" ";
    cout<<endl;
    for(int i=0;i<=cnt1;i++)
        cout<<A[i].cnt<<" ";
    cout<<endl;
    for(int i=0;i<=cnt2;i++)
        cout<<B[i].ch<<" ";
    cout<<endl;
    for(int i=0;i<=cnt2;i++)
        cout<<B[i].cnt<<" ";
    cout<<endl;
    */
        int flag = 0;
        for (int i = 0; i <= cnt1; i++)
        {
            if (A[i].ch == B[0].ch && A[i].cnt >= B[0].cnt)
            {
                int flag2 = 1;
                for (int j = 1; j < cnt2; j++)
                {
                    if (A[i + j].ch != B[j].ch || A[i + j].cnt != B[j].cnt)
                    {
                        flag2 = 0;
                        break;
                    }
                }
                if (flag2)
                {
                    if (A[i + cnt2].ch == B[cnt2].ch && A[i + cnt2].cnt >= B[cnt2].cnt)
                    {
                        flag = 1;
                        break;
                    }
                }
            }
        }
        if (cnt1 == -1 && cnt2 == -1) break;
        if (flag) printf("True\n");
        else printf("False\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-18 18:53:25

FZU 2183 简单题(字符串匹配|字符串压缩)(简单)的相关文章

CCF模拟题 字符串匹配

字符串匹配 时间限制: 1.0s 内存限制: 256.0MB 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符:当选项关闭时,表示同一个字母的大写和小写看作相同的字符. 输入格式 输入的第一行包含一个字符串S,由大小写英文字母组成. 第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感. 第三行包含一个整数n,表示给出的文字的行数. 接下来n

技巧之字符串的简单处理

1)比较字符串 比较字符串是指按照字典排序规则,判定两个字符的相对大小.按照字典规则,在一本英文字典中,出现在前面的单词小于出现在后面的单词.在String类中,常用的比较字符串的方法包括Compare.CompareTo.CompareOrdinal以及Equals,下面进行详细介绍. Compare方法是String类的静态方法,用于全面比较两个字符串对象,包括6种重载方法.CompareTo方法将当前字符串对象与另一个对象做比较,其作用与Compare类似,返回值也相同.CompareTo

PHP字符串压缩

在PHP中偶尔遇到字符串的压缩,比如一个长字符串,数据库开始设计的字段存不下,但是又不想改数据库字段存储长度,就可以用压缩的方式降低数据字段字符串的长度数量级,把几百个字符的字符串压缩到几十个字符.总结下来有以下几个: 压缩函数:gzcompress gzdeflate gzencode 与之对应的解压函数如下: 解压函数:gzuncompress gzinflate gzdecode 特别注意:gzdecode是PHP 5.4.0之后才加入的,使用的时候要注意兼容性问题. gzcompress

算法题之字符串匹配问题

我最近复习一道困难程度的算法题,发现了许多有趣之处.在借鉴了他人解法后,发现从最简单的情况反推到原题是一种解锁新进阶的感觉.从递归到动态规划,思维上一步一步递进,如同一部跌宕起伏的小说,记录下来和诸君共赏之. 题目如下: 给你一个字符串?s?和一个字符规律?p,请你来实现一个支持 '.'?和?'*'?的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖?整个?字符串?s的,而不是部分字符串. 说明: s?可能为空,且只包含从?a-z?的小写字母

九度机试 题目1165:字符串匹配 2008年北京航空航天大学计算机研究生机试真题

题目1165:字符串匹配 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2497 解决:858 题目描述: 读入数据string[ ],然后读入一个短字符串.要求查找string[ ]中和短字符串的所有匹配,输出行号.匹配字符串.匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配.如"aa[123]bb",就是说aa1bb.aa2bb.aa3bb都算匹配. 输入: 输入有多组数据. 每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(

数据结构之 字符串---字符串匹配(kmp算法)

串结构练习——字符串匹配 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定两个字符串string1和string2,判断string2是否为string1的子串. 输入 输入包含多组数据,每组测试数据包含两行,第一行代表string1,第二行代表string2,string1和string2中保证不出现空格. 输出 对于每组输入数据,若string2是string1的子串,则输出"YES",否则输出"NO". 示例输入

微软算法100题88 将字符串中的字符&#39;*&#39;移到串的前部分

函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量.如原始串为:ab**cd**e*12,处理后为*****abcde12,函数并返回值为5.(要求使用尽量少的时间和辅助空间) 思路:类似于快速排序,用两个指针分别指向字符数组的左右边界,寻找左边第一个不为*的字符,寻找右边第一个*,然后交换字符,然后继续寻找和交换的过程,直到两个指针相交, 时间复杂度o(n), 空间复杂度o(1) 第一个写的程序有问题,没有考虑到保持

[算法系列之十四]字符串匹配之Morris-Pratt字符串搜索算法

前言 我们前面已经看到,蛮力字符串匹配算法和Rabin-Karp字符串匹配算法均非有效算法.不过,为了改进某种算法,首先需要详细理解其基本原理.我们已经知道,暴力字符串匹配的速度缓慢,并已尝试使用Rabin-Karp中的一个散列函数对其进行改进.问题是,Rabin-Karp的复杂度与强力字符串匹配相同,均为O(mn). 我们显然需要采用一种不同方法,但为了提出这种不同方法,先来看看暴力字符串匹配有什么不妥之处.事实上,再深入地研究一下它的基本原理,就能找到问题的答案了. 在暴力匹配算法中,需要检

正则表达式的使用,字符串提取,字符串匹配(C#语言)

在程序中常常设计字符串的处理,比如①:判断用户的输入字符串是否符合要求,是否是非法字符串,②:取出一个很复杂字符串的某一程序中需要的部分等 这事用自己写算法判断通常是十分困难的,所以遇到字符串的处理时要很快想到用正则表达式. 一:正则表达式元字符 •要想学会正则表达式,理解元字符是一个必须攻克的难关.不用刻意记 •.:匹配任何单个字符.例如正则表达式“b.g”能匹配如下字符串:“big”.“bug”.“b g”,但是不匹配“buug”,“b..g”可以匹配“buug”. •[ ] :匹配括号中的