TOJ---2754---类似于字符串匹配

先去开撸了 把代码 贴上  ^ ^

一段 暴力 TLE --

一段 AC ---

暴力 : TLE

 1 #include <iostream>
2 #include <cstring>
3 #include <cstdio>
4 using namespace std;
5
6 const int size = 50010;
7 char str[size]; // 开头
8 char ch[size]; // 结尾
9
10 int main()
11 {
12 int i , j;
13 int len1 , len2;
14 int num;
15 bool flag;
16 while( ~scanf("%s %s",str,ch) )
17 {
18 flag = false;
19 i = j = num = 0;
20 len1 = strlen(str); // 提供开头字符串
21 len2 = strlen(ch); // 提供结尾字符串
22 while( i<len2 )
23 {
24 if( ch[i]==str[j] )
25 {
26 //printf( "%c %c\n",ch[i],str[j] );
27 j++;
28 i++;
29 num++;
30 if( i==len2-1 )
31 flag = true;
32 }
33 else
34 {
35 num = 0;
36 j = 0;
37 }
38 }
39 if( !flag )
40 printf("0\n");
41 else
42 {
43 for( j = 0 ; j<num ; j++ )
44 printf( "%c",str[j] );
45 printf( " %d\n",num );
46 }
47 }
48 return 0;
49 }

稍微优化 剪枝: AC

 1 #include <iostream>
2 #include <cstring>
3 #include <cstdio>
4 using namespace std;
5
6 const int size = 50010;
7 char str[size]; // 开头
8 char ch[size]; // 结尾
9
10 int main()
11 {
12 int i;
13 int len1 , len2;
14 bool flag , temp;
15 while( ~scanf("%s %s",str,ch) )
16 {
17 flag = true;
18 temp = false;
19 len1 = strlen(str); // 提供开头字符串
20 len2 = strlen(ch); // 提供结尾字符串
21 i = len1-1; // 第一个字符串的末坐标
22 while( i>=0 )
23 {
24 if( i<=len2-1 && str[i] == ch[len2-1] && str[0] == ch[len2-1-i] ) //要想接龙成功 那么接龙的字符串长度就是i+1 分别比较2个字符串的开头与末尾
25 {
26 int t = len2-1-i;
27 for( int k = 0 ; k<=i ; k++ , t++ )
28 {
29 if( str[k]!=ch[t] )
30 {
31 flag = false; //标记 失败 break终止比较
32 break;
33 }
34 }
35 if( flag ) //这里就是 接龙成功输出字符串
36 {
37 for( int k = 0 ; k<=i ; k++ , t++ )
38 {
39 printf( "%c",str[k] );
40 }
41 printf( " %d\n",i+1 );
42 temp = true; //标记 跳出循环
43 }
44 }
45 flag = true; //重置标记
46 i--; //继续往前移动
47 if( temp )
48 break;
49 }
50 if( !temp )
51 printf("0\n");
52 }
53 return 0;
54 }

先去撸了 ~~~

好吧 我的 大锐雯 die ....

回过来  看这题 发现也没什么好写的 。。。。

我将一些细节 在注释里也写了

today:  //  今天来句 洋气的

      One
is always on a strange road, watching strange scenery and listening to strange
music. Then one day, you will find that the things you try hard to forget are
already gone.

    

TOJ---2754---类似于字符串匹配

时间: 2024-11-17 05:36:42

TOJ---2754---类似于字符串匹配的相关文章

字符串匹配 — Horspool

蛮力法进行字符串匹配的缺点在于每次失配后模式只向后移动一个位置.想要提高算法效率,就必须在不错过文本中一个匹配子串风险的前提下,尽量增大模式向后移动的幅度.Horspool就是这样一种算法之一,它的思想要比KMP算法容易.它采用了输入增加技术:对模式进行预处理得到一些信息,把这些信息存储在表中,当文本和模式进行匹配时就会用到这些信息.Horspool的匹配过程是从右向左进行的,在匹配过程中会出现以下四种情况: 情况1 文本:x x x x A x x x x x 模式:    x x B 最后一

字符串匹配(BF,BM,Sunday,KMP算法解析)

字符串匹配一直是计算机领域热门的研究问题之一,多种算法层出不穷.字符串匹配算法有着很强的实用价值,应用于信息搜索,拼写检查,生物信息学等多个领域. 今天介绍几种比较有名的算法: 1. BF 2. BM 3. Sunday 4. KMP -,BF算法 BF(Brute Force)算法又称为暴力匹配算法,是普通模式匹配算法. 其算法思想很简单,从主串S的第pos个字符开始,和模式串T的第一个字符进行比较,若相等,则主串和模式串都后移一个字符继续比较:若不相同,则回溯到主串S的第pos+1个字符重新

uva:10340 - All in All(字符串匹配)

题目:10340 - All in All 题目大意:给出字符串s和t,问s是否是t的子串.s若去掉某些字符能和t一样,那么t是s的子串. 解题思路:匹配字符.t的每个字符和s中的字符匹配.注意这里的字符数组大小要开大点. 代码: #include <stdio.h> #include <string.h> const int N = 1000005; char s[N], t[N]; bool match () { int i = 0; int lens = strlen(s);

CCF 字符串匹配

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

字符串匹配的KMP算法

html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; line-height: 1.6; color: ; background-color: ; margin: 0; padding: 16px 20px; } h1, h2, h

字符串匹配与KMP算法笔记

>>字符串匹配问题 字符串匹配问题即在匹配串中寻找模式串是否出现, 首先想到的是使用暴力破解,也就是Brute Force(BF或蛮力搜索) 算法,将匹配串和模式串左对齐,然后从左向右一个一个进行比较, 如果不成功则模式串向右移动一个单位,直到匹配成功或者到达匹配串最后仍然不成功,返回失败. 很明显,这种算法有很多的地方可以优化,假设要搜索的串为S,长度为n,要匹配的串为M,长度为m,时间复杂度为O(nm). >>KMP算法 Knuth-Morris-Pratt算法以三个发明者命名

KMP算法解决字符串匹配

该算法由D.E.Knuth ,J.H.Morris和 V.R.Pratt提出,用于解决字符串匹配问题. 思想: 设目标串(主串)为s,模式串为t ,并设i指针和j指针分别指示目标串和模式串中正待比较的字符,设i和j的初值均为0.若有s[i]=t[j],则i和j分别加1.否则,i不变,j退回到j=next[j-1]的位置,再比较s[i]和t[j],若相等,则i和j分别加1.否则,i不变,j再次退回到j=next[j]的位置,依此类推.直到下列两种可能: 1. 模式串t中的字符全部匹配,则出现频率+

字符串匹配 【kmp】

字符串匹配 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 214 Solved: 81 Description 给你两个字符串A,B,请输出B字符串在A字符串中出现了几次. Input 多组测试数据,每组输入两个字符串.字符串的长度 <= 1000000. Output 输出B在A中出现的次数. Sample Input aaa aa Sample Output 1 子串在母串中出现的次数,串不重叠 #include <stdio.h> #

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

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

字符串匹配问题

.字符串匹配问题 [问题描述] 字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配.如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如.输入: [()] 输出:YES,而输入([]), ([])都应该输出NO. [输入格式]strs.in 文件的第一行为一个整数n,表示以下有多少个由括好组成的字符串.接下来的n行,每行都是一个由括号组成的长度不超过255的字符串. [输出格式]strs.out 在输出文件中有N行,每行都是YES或NO. [