`

poj 1035

poj 
阅读更多
总时间限制:
2000ms
内存限制:
65536kB
描述
现在有一些英语单词需要做拼写检查,你的工具是一本词典。需要检查的单词,有的是词典中的单词,有的与词典中的单词相似,你的任务是发现这两种情况。单词A与单词B相似的情况有三种:
1、删除单词A的一个字母后得到单词B;
2、用任意一个字母替换单词A的一个字母后得到单词B;
3、在单词A的任意位置增加一个字母后得到单词B。
你的任务是发现词典中与给定单词相同或相似的单词。

 

输入
第一部分是词典中的单词,从第一行开始每行一个单词,以"#"结束。词典中的单词保证不重复,最多有10000个。
第二部分是需要查询的单词,每行一个,以"#"结束。最多有50个需要查询的单词。
词典中的单词和需要查询的单词均由小写字母组成,最多包含15个字符。
输出
按照输入的顺序,为每个需要检查的单词输出一行。如果需要检查的单词出现在词典中,输出“?x is correct",?x代表需要检查的单词。如果需要检查的单词没有出现在词典中,则输出"?x: ?x1 ?x2 ...?xn",其中?x代表需要检查的单词,?x1...?xn代表词典中与需要检查的单词相似的单词,这些单词中间以空格隔开。如果没有相似的单词,输出"?x:"即可。
样例输入
i
is
has
have
be
my
more
contest
me
too
if
award
#
me
aware
m
contest
hav
oo
or
i
fi
mre
#
样例输出
me is correct
aware: award
m: i my me
contest is correct
hav: has have
oo: too
or:
i is correct
fi: i
mre: more me
   解决方案: Java
import java.util.Scanner;
public class Main{
	String str[] = new String[10001];
	

	public static void main(String[] args) {
		new Main().test();

	}

	public void test() {
		Scanner sc = new Scanner(System.in);
		int index = 0;
		String s;
		while (sc.hasNext()) {// 读入字典中的单词
			s = sc.next();
			if (s.equals("#"))
				break;
			else
				str[index++] = s;
		}
		while (sc.hasNext())// 读入写入的单词
		{
			s = sc.next();
			if (s.equals("#"))
				break;
			else
				strCompare(s, index);
		}

	}
   /*
   删除字符中的一个元素
   */
    public String strChange(String s,int index,int len)
    {    String temp, temp1;
    	 if(index==0){
    		temp = s.substring(index+1) ;
    	 }else if(index==len-1){
    		 temp = s.substring(0, index);
    	 }else{
    		 temp = s.substring(0,index) ;
    		 temp1 = s.substring(index+1) ;
    		 temp =temp +temp1 ;
    	 }
    //	 System.out.println(temp);
    	return temp ;
    }
   /*
   *字符串比较
   */
	public void strCompare(String s, int index) {
		int i, j;
		for (i = 0; i < index; i++) {//相等后返回
			if (s.equals(str[i])) {
				System.out.println(s + " is correct");
				return;
			}
		}
		System.out.print(s + ":");
		//不相等时
		for (i = 0; i < index; i++) {//遍历字典
			if (s.length() == (str[i].length() + 1)) {//待测单词长度为字典单词加1
				for (j = 0; j < s.length(); j++) {
				//	System.out.println(str[i]);
				String temp = strChange(s,j,s.length());
					if (temp.equals(str[i])) {
						System.out.print(" " + str[i]);
						break;
					}

				}
			}else if(s.length() == (str[i].length()-1))
			{
				for (j = 0; j < str[i].length(); j++) {
					//System.out.println(str[i]) ;
				String s1 = strChange(str[i],j,str[i].length()) ;
				if(s1.equals(s))
				{   
				//	System.out.print("哈哈");
					System.out.print(" " + str[i]);
					break ;
				}
				}
			}
			else if(s.length() == str[i].length())
			{
				for(j=0;j<s.length();j++)
				{ 
					//System.out.println(str[i]);
				String	s1 = strChange(s,j,s.length());
				String	s2 = strChange(str[i],j,str[i].length()) ;
					if(s1.equals(s2))
					{
						System.out.print(" " + str[i]);
						break ;
					}
				}
			}
		}
		System.out.println();
	}
}
 解决二 : G++:
#include <stdio.h>
#include <string.h>
int Find(int a);
int n;
int lend[10001];
char Dt[10001][20],In[20],len;
int Find(int a)
{
    int i,t;
    t=lend[a]-len;
    if (t==-1)
    {
       for (i=0;i<lend[a]&&Dt[a][i]==In[i];i++);
        for (;i<lend[a]&&Dt[a][i]==In[i+1];i++);
        if (i==lend[a])
            return 0;
    }
    else if (t==0)
    {
        for (i=0;i<len&&Dt[a][i]==In[i];i++);
        for (i++;i<len&&Dt[a][i]==In[i];i++);
        if (i==len)
            return 0;
    }
    else if (t==1)
    {
        for (i=0;i<len&&Dt[a][i]==In[i];i++);
        for (;i<len&&Dt[a][i+1]==In[i];i++);
        if (i==len)
            return 0;
    }
    return 1;
}
int main()
   {
    int i;
    scanf("%s",&Dt[0][0]);
    while (Dt[n][0]!='#')
    {
        lend[n]=strlen(Dt[n]);
        scanf("%s",&Dt[++n][0]);
    }
    scanf("%s",In);
    while (In[0]!='#')
    {
        len=strlen(In);
        for (i=0;i<n;i++)
            if (lend[i]==len&&strcmp(Dt[i],In)==0)
            {
                    printf("%s is correct\n",In);
                break;
          }
            if (i==n)
            {
                printf("%s:",In);
                for (i=0;i<n;i++)
                    if (Find(i)==0) printf(" %s",Dt[i]);
                    printf("\n");
            }
            scanf("%s",In);
    }    return 0;
}
 
分享到:
评论

相关推荐

    POJ1035-Spell checker 测试数据

    "POJ1035-Spell checker 测试数据" 是一个与编程竞赛相关的主题,其中“POJ”是北京大学主办的在线编程平台Problem Online Judge的缩写,它提供了各种算法题目供参赛者挑战。"Spell checker" 指的是这个题目所涉及的...

    POJ1035-Spell checker

    【标题】"POJ1035 - Spell checker"是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Set of Peking University)。这个题目要求参赛者编写一个拼写检查器,对输入的单词进行错误检测并提供可能的纠正...

    多种解题技巧POJ1035_Spelling Checker

    《多种解题技巧在POJ1035_Spelling Checker中的应用》 在编程竞赛领域,ACM(国际大学生程序设计竞赛)是一项备受瞩目的赛事,它要求参赛者在有限的时间内解决一系列复杂的算法问题。POJ(Problemset Online Judge...

    POJ算法题目分类

    * 串:串是指解决问题的基本数据结构,如 poj1035、poj3080、poj1936。 * 排序:排序是指解决问题的排序算法,如快排、归并排、堆排。 * 简单并查集:简单并查集是指解决问题的简单并查集算法。 * 哈希表和二分查找...

    poj题目分类

    * 串:例如 poj1035、poj3080、poj1936。 * 排序:例如 poj2388、poj2299。 * 简单并查集的应用。 * 哈希表和二分查找等高效查找法:例如 poj3349、poj3274、poj2151、poj1840、poj2002、poj2503。 * 哈夫曼树...

    poj训练计划.doc

    - 字符串处理:如KMP算法和后缀数组,用于字符串搜索和模式匹配,如`poj1035, poj3080`。 - 排序算法:如快速排序和归并排序,用于对数据进行排序,如`poj2388, poj2299`。 - 并查集:用于处理集合的合并和查询...

    ACM-POJ 算法训练指南

    1. **树和二叉树**:树和二叉树的基本操作和应用(poj1035, poj3080, poj1936)。 2. **堆**:堆排序及其在优先队列中的应用(poj2388, poj2299)。 3. **哈希表**:用于快速查找和存储,如Hash函数的设计(poj3349,...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj1035, poj3080, poj1936 - **解释**:树形数据结构的题目通常涉及树的遍历、查找等问题。 #### 2. 字符串 - **例题**:poj2388, poj2299 - **解释**:字符串问题通常涉及字符串的模式匹配、编辑距离...

    POJ2586-Y2K Accounting Bug

    【标题】"POJ2586-Y2K Accounting Bug" 是一道来自北京大学在线判题系统POJ(Problem Set)的编程题目。该题目主要关注的是计算机编程中的一个历史问题——Y2K千年虫问题(Year 2000 Problem),同时也涉及到会计...

    POJ题目简单分类(ACM)

    - **字符串处理**:如poj1035,涉及字符串操作和模式匹配。 - **排序算法**:包括快速排序、归并排序和堆排序,如poj2388,优化查找效率。 - **并查集**:用于处理集合合并与查询问题。 - **哈希表和二分查找**...

    acm训练计划(poj的题)

    - (poj1035, poj3080, poj1936):基本的数据结构及其应用场景。 2. **树**: - (poj2388, poj2299):介绍二叉树、平衡二叉树等。 3. **字符串处理**: - (poj3349, poj3274, POJ2151, poj1840, poj2002, poj...

    acm poj300题分层训练

    poj1035、poj3080等训练了串的操作,poj2388、poj2299等则涉及排序问题,poj2524、poj1611等是并查集的实例,poj3349、poj3274等展示了哈希表和二分查找,poj3253是哈夫曼树的题目,poj2442和poj1442则关于堆。...

    acm新手刷题攻略之poj

    - 推荐题目:[poj1035](https://vjudge.net/problem/POJ-1035)、[poj3080](https://vjudge.net/problem/POJ-3080)、[poj1936](https://vjudge.net/problem/POJ-1936) - 堆结构通常用于实现优先队列等数据结构。 2...

    POJ 分类题目

    - poj1035 - poj3080 - poj1936 - **应用场景**:适用于文本处理、模式匹配等问题。 **2. 排序** - **定义**:包括快速排序、归并排序、堆排序等。 - **示例题目**: - poj2388 - poj2299 - **应用场景**:...

    强大的POJ分类——各类编程简单题及其算法分类

    1. **串**:处理字符串的问题,如POJ1035、3080和1936。 2. **排序**:包括快速排序、归并排序(涉及逆序数)、堆排序,如POJ2388、2299。 3. **并查集**:处理集合合并和查询问题。 4. **哈希表** 和 **二分查找**...

    POJ题目分类

    - **示例题目**: poj1035, poj3080, poj1936 #### 2. 栈 - **内容**: 包括栈的基本操作如入栈、出栈等。 - **示例题目**: poj2388, poj2299 #### 3. 字典树 - **内容**: 字典树是一种高效的数据结构,主要用于...

    ACMer需要掌握的算法讲解 (2).docx

    * 串算法:POJ1035、POJ3080、POJ1936 * 哈希表和二分查找等高效查找法:POJ3349、POJ3274、POJ2151、POJ1840、POJ2002、POJ2503 * 哈夫曼树:POJ3253 * 背包问题:POJ1837、POJ1276 * DP算法:POJ3267、POJ1836、...

    ACM常用算法及其相应的练习题.docx

    * 串:poj1035, poj3080, poj1936 * 排序:快排、归并排、堆排 + poj2388, poj2299 * 简单并查集的应用 * 哈希表和二分查找等高效查找法 + poj3349, poj3274, poj2151, poj1840, poj2002, poj2503 * 哈夫曼树:poj...

    ACM 详解算法目录

    例如,POJ1035和POJ3080是串的经典例题,而POJ2388和POJ2299则是排序算法的代表题。 在简单搜索部分,涵盖了深度优先搜索和广度优先搜索两种搜索算法。例如,POJ2488和POJ3083是深度优先搜索的经典例题,而POJ3278...

Global site tag (gtag.js) - Google Analytics