360笔试题,字符串s通过复制能不能得到字符串t
笔试的时候题目要求没看清楚,然后导致想法都是错的,然后下来之后又做了一遍,不知道有没有考虑不足的地方,大佬们帮我看看,感谢 题目描述: 小明最近学会了快捷键Ctrl C、Ctrl V。具体来说,给她一个字符串, 她复制其中的一个字符并将其粘贴到这个字符的下一位,从而整个字符串的长度加一。 小树来检测她的学习成果。他给出两个字符串 s、t,小明可以对 s 进行任意次复制粘贴操作,请问她能否将 s 转化成 t? 输入描述 本题采用多组数据测试,第一行为数据组数T。在接下来的每组数据中(1<=T<=100)第一行有一个非空字符串 s,第二行有一个非空字符串 t 。 字符串中均为小写字母,所有测试数据的 s 的长度之和与 t 的长度之和都不超过106。 输出描述 对于每组数据输出一行,如果可以转化输出YES,否则输出NO。 样例输入 4 hello hello hello helloo hello hlllloo hello helo 样例输出 YES Y ES NO NO
import java.util.*; public class Main{ public static void main(String args[]){ Solution solution = new Solution(); Scanner sc = new Scanner(System.in); int num = sc.nextInt(); String[] s = new String[num]; String[] t = new String[num]; for(int i = 0;i<num;i++){ s[i] = sc.next(); t[i]= sc.next(); } for (int i = 0;i<num;i++){ System.out.println(solution.fun(s[i],t[i])); } } } class Solution{ public String fun(String s,String t){ //如果第一个字符串比第二个长返回NO if(s.length()>t.length()){ return "NO"; } //如果两个字符串相等返回YES if(s.equals(t)){ return "YES"; } //首先判断如果第一位都不相等,那么通过复制肯定不会相同直接返回NO if (s.charAt(0)!=t.charAt(0)){ return "NO"; } //指针1指向字符串1 int slow = 1; //指针2指向字符串2 int fast = 1; //遍历字符串2 //abc //aaabc while(fast<t.length()){//这边不能使用for循环,因为fast指针不一定每次都加一,所以如果采用for循环,会导致没遍历完字符串循环就结束了 //如果s[slow]等于t[fast],两个都往后移一位 if (s.charAt(slow)==t.charAt(fast)){ //如果第一个已经移到头那么slow就不能继续++,slow应该固定为s.length()-1 if (slow>=(s.length()-1)){ slow = s.length()-1; }else{ slow++; } fast++; }else if(s.charAt(slow)!=t.charAt(fast)&&s.charAt(slow-1)==t.charAt(fast)){ //如果s中当前字符不等于t当前字符,但是s当前字符前一位等于t当前字符, //那么将slow-1 slow--; }else {//如果走到这里说明s当前字符不等于t当前字符,并且前一个字符也不等于t当前字符,那么便无法通过复制使得s与t相同,返回NO //abcab //aabbccaabbcc return "NO"; } } return "YES"; } }
#360笔试#