给定两个字符串s和t,请判断s是否是t的子序列

lxd_521 2012-11-06 09:05:21
【问题描述】
给定两个字符串s和t,请判断s是否是t的子序列。即从t中删除一些字符,将剩余的字符连接起来,即可获得s。
【输入形式】
包括若干个测试数据。每个测试数据由两个ASCII码的数字和字母串s和t组成,s和t的长度不超过100000。
【输出形式】
对每个测试数据,如果s是t的子序列则输出“Yes”,否则输出“No”。
【样例输入1】
sequence subsequence
【样例输出1】
Yes
【样例输入2】
person compression
【样例输出2】
No
【样例输入3】
VERDI vivaVittorioEmanueleReDiItalia
【样例输出3】
Yes

package java5.exam;

import java.util.Scanner;

public class Abc {
public static void main(String[]args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
String t = scanner.nextLine();
int i;
int j;
int w=0;
for(i=0;i<=s.length()-1;i++){
for(j=0;j<=t.length()-1;j++){
if(s.charAt(i)==t.charAt(j)){
w++;
j++;

}
}
if(j>=t.length()){
break;
}
if(w==s.length()){
System.out.println("Yes");

}else
System.out.println("No");


}

请问到底哪里错了
...全文
4705 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
MiceRice 2012-11-07
  • 打赏
  • 举报
回复
6楼的代码写的不错,即便处理 10W 长度的字符串,循环应该也可在1秒内完成。
lxd_521 2012-11-07
  • 打赏
  • 举报
回复
引用 6 楼 tiwerbao 的回复:
引用 1 楼 ldh911 的回复:即从t中删除一些字符,将剩余的字符连接起来,即可获得s。 这个应该用一层循环就可以结束战斗。 1、按照t进行逐个字遍历,同时从s的首字开始(s指针为0); 2、如果t当前字跟s当前字一致,则s指针++; 3、如果s指针已经到达末尾,则说明要求成立,退出。 4、t指针++; 5、如果t指针已经到达末尾,说明要求不成立,退出……
确实也对的
Jacky-止涯 2012-11-06
  • 打赏
  • 举报
回复
引用 1 楼 ldh911 的回复:
即从t中删除一些字符,将剩余的字符连接起来,即可获得s。 这个应该用一层循环就可以结束战斗。 1、按照t进行逐个字遍历,同时从s的首字开始(s指针为0); 2、如果t当前字跟s当前字一致,则s指针++; 3、如果s指针已经到达末尾,则说明要求成立,退出。 4、t指针++; 5、如果t指针已经到达末尾,说明要求不成立,退出。 6、继续循环到2.
1楼的是正确的,这样代码量以及效率都会提高:

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        String t = scanner.nextLine();
        int j = 0;
        for (int i = 0; i < t.length(); i++) {
            if (t.charAt(i) == s.charAt(j)) {
                j++;  // 相等的话,指针右移一位
                if (j >= s.length()) {
                    System.out.println("Yes");
                    return;
                }
            }
        }
        System.out.println("NO");
    }
lxd_521 2012-11-06
  • 打赏
  • 举报
回复
好了,完美解决
lxd_521 2012-11-06
  • 打赏
  • 举报
回复

引用 3 楼 nmyangym 的回复:
改了一下,楼主试试: Java code123456789101112131415161718192021222324252627282930313233343536373839import java.util.Scanner; public class Abc{ public static void main(String[]args) { ……
真的解决了,把nextLine()改成next()就好了,那s和t的长度不超过100000怎么解决,十分感谢
nmyangym 2012-11-06
  • 打赏
  • 举报
回复
改了一下,楼主试试:

import java.util.Scanner;

public class Abc
{
	public static void main(String[]args) 
	{
		Scanner scanner = new Scanner(System.in);
		String s = scanner.nextLine();
		String t;
		do
		{
			t = scanner.nextLine();
		}while(t.length()<s.length());				//t 的长度要大于等于s的长度。
		int i;						
		int j;
		int w=0;
		for(i=0;i<=s.length()-1;i++)
		{
			for(j=w;j<=t.length()-1;j++)			//从w 开始匹配。(不要再从头去匹配了)。
			{
				if(s.charAt(i)==t.charAt(j))
				{
					w++;				//找到匹配的,w递增1。 内层循环中断,判断下一个。
					break;
				}	
			}
		}

		if(w==s.length())					//循环结束,判断w的长度。
		{
			System.out.println("Yes");
		}
		else
		{
			System.out.println("No");
		}
	}
}
lxd_521 2012-11-06
  • 打赏
  • 举报
回复
刚学JAVA,能不能高速我错在哪了,说的通俗点,
MiceRice 2012-11-06
  • 打赏
  • 举报
回复
即从t中删除一些字符,将剩余的字符连接起来,即可获得s。 这个应该用一层循环就可以结束战斗。 1、按照t进行逐个字遍历,同时从s的首字开始(s指针为0); 2、如果t当前字跟s当前字一致,则s指针++; 3、如果s指针已经到达末尾,则说明要求成立,退出。 4、t指针++; 5、如果t指针已经到达末尾,说明要求不成立,退出。 6、继续循环到2.

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧