poj 1035 字符串匹配

//刚开始傻乎乎的拿字典树写,佛了,就一水题

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 1e4 + 15;
string strArr[maxn];
int cnt = 0;
int main()
{
    while(1)
    {
        cin>>strArr[cnt++];
        if(strArr[cnt-1]=="#")
        {
            --cnt;
            strArr[cnt] = "";
            break;
        }
    }//输入字典
    string words;
    while(cin>>words)
    {
        if(words=="#")
            break;
        int i;
        for(i=0;i!=cnt;++i)
            if(strArr[i]==words)
            {
                cout<<words<<" "<<"is correct"<<endl;
                break;
            }
        if(i!=cnt)
            continue;
        //比较缺多或替换了的
        cout<<words<<":";
        for(int i=0;i!=cnt;++i)
        {
            if(words.length()==strArr[i].length())//如果字符匹配长度相等,单纯替代
            {
                int differ = 0;
                for(int j=0;j!=words.length();++j)
                    if(words[j]==strArr[i][j])
                        ++differ;
                if(differ==words.length()-1)
                    cout<<" "<<strArr[i];
            }//单纯的取代一个字符
            if((words.length()-strArr[i].length())==1||(words.length()-strArr[i].length())==-1)
            {
                //用短的字符匹配长的字符
                string strShort,strLong;
                if(words.length()<strArr[i].length())
                {
                    strShort = words;
                    strLong = strArr[i];
                }else{
                    strShort = strArr[i];
                    strLong = words;
                }
                int cur = 0;//当前匹配的longstr len
                int num = 0;//匹配的正确字符个数
                for(int j=0;j<strShort.length();++j)
                {
                    for(int k=cur;k<strLong.length();++k)
                    {
                        if(strShort[j]==strLong[k])
                        {
                            cur = k+1;
                            ++num;
                            break;//进行下一个字符匹配
                        }
                    }
                }//短匹配长字符
                if(num==strShort.length())
                    cout<<" "<<strArr[i];
            }//如果存在增删的单词
        }
        cout<<endl;
    }
}

原文地址:https://www.cnblogs.com/newstartCY/p/11522128.html

时间: 2024-10-12 04:18:01

poj 1035 字符串匹配的相关文章

POJ 1159 字符串匹配问题

题目大意: 问至少添加几个字符才能保证这个字符串是个回文串 一开始想也想不到字符串匹配上,因为是找回文串,我们可以把已给字符串逆向得到一个新的字符串,然后比较两者得到最大匹配长度,最后总长度减去最大匹配长度 就是所要求的值 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 #define

POJ 1035 代码+详细注释

Spell checker Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 19319 Accepted: 7060 Description You, as a member of a development team for a new spell checking program, are to write a module that will check the correctness of given words us

POJ 1035 代码+具体的目光

Spell checker Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 19319 Accepted: 7060 Description You, as a member of a development team for a new spell checking program, are to write a module that will check the correctness of given words us

POJ 1035 Spell Check 字符串处理

被这样的题目忽悠了,一开始以为使用Trie会大大加速程序的,没想到,一不小心居然使用Trie会超时. 最后反复试验,加点优化,终于使用Trie是可以过的,不过时间大概难高于1500ms,一不小心就会超时. 看来这是一道专门卡Trie的题目,只好放弃不使用Trie了. 也得出点经验,如果字符串很多,如本题有1万个字符串的,那么还是不要使用Trie吧,否则遍历一次这样的Trie是十分耗时的,2s以上. 于是使用暴力搜索法了,这里的技巧是可以使用优化技术: 1 剪枝:这里直接分组搜索,分组是按照字符串

POJ 1035 Spell checker (串)

题目大意: 问你后面输入的串能不能通过  加减一个字符,或者替换一个字符变成字典中的串. 思路分析: 直接模拟替换加减的过程. 比较两个串的长度.要相差为1 的时候才能进行模拟. 模拟的过程就是进行一个个的匹配. 发现失配的次数小于等于 1就可以输出. #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <string> #i

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算法以三个发明者命名