1472. 双胞胎字符串

给定两个字符串 s和t,每次可以任意交换s的奇数位或偶数位上的字符,即奇数位上的字符能与其他奇数位的字符互换,而偶数位上的字符能与其他偶数位的字符互换,问能否经过若干次交换,使s变成t。

样例
给出 s=“abcd”,t=“cdab”,返回"Yes"。

解释:
第一次a与c交换,第二次b与d交换。
给出 s=“abcd”,t=“bcda”,返回"No"。

解释:
无论如何交换,都无法得到bcda。
注意事项
字符串长度均不超过100000100000
字符串可由大写字母、小写字母及数字组成


解答过程:
第一次结果:中间错误

public class Solution {
    /**
     * @param s: the first string
     * @param t: the second string
     * @return: If they are twin strings
     */
    public String isTwin(String s, String t) {
        // Write your code here
         if(s == null || t == null){
            return "No";
        }
        if(s.length() != t.length()) return "No";
        
        char[] char_s = s.toCharArray();
        char[] char_t = t.toCharArray();
        
        
        boolean flag = false;
         
        for (int i = 0; i< char_s.length ; i=i+2 ) {
            for (int j = 0; j< char_t.length ; j=j+2 ) {
                if(char_s[i] == char_t[j]){
                    flag = true;
                }
            }
            if(flag == false){
                return "No";
            }else{
                flag = false;
            }
        }
        
        for (int i = 1; i< char_s.length ; i=i+2 ) {
            for (int j = 1; j< char_t.length ; j=j+2 ) {
                if(char_s[i] == char_t[j]){
                    flag = true;
                }
            }
            if(flag == false){
                return "No";
            }else{
                if(i ==  char_s.length-2 || i ==  char_s.length-1){
                   flag = true;
                }else {
                    flag = false;
                }
                
            }
        }
        
        if(flag == true){
             return "Yes";
        }else {
        	 return "No";
		}
    
    }
	/**
	*主函数
	*/
	public static void main(String[] args) {
		Solution solution = new Solution();
		String twin = solution.isTwin("abcd", "cbad");
		System.out.println(twin);
	}
}

虽然可以运行出结果,但是时间复杂度为O(N2);运行耗时6370ms。时间耗时太长了!!!

还发现其中的逻辑错误!当输入"abad", "cbad"时候,输出的结果还是会Yes,这是不争取的!!

1472. 双胞胎字符串_字符串

为了提高效率,修改其中的业务逻辑
后期发现其中逻辑错误:修改后的代码如下,通过!!

package test;

public class Solution {
    /**
     * @param s: the first string
     * @param t: the second string
     * @return: If they are twin strings
     */
    public String isTwin(String s, String t) {
        // Write your code here
        if(s == null || t == null){
            return "No";
        }
        if(s.length() != t.length()) return "No";
        
        char[] char_s = s.toCharArray();
        char[] char_t = t.toCharArray();
        
        
        boolean flag = false;
         
        for (int i = 0; i< char_s.length ; i=i+2 ) {
            for (int j = i; j< char_t.length ; j=j+2 ) {
                if(char_s[i] == char_t[j]){
                	char tem = char_t[i];
                	char_t[i] = char_t[j];
                	char_t[j] = tem;
                	flag = true;
                	break;
                }
            }
            if (char_s[i] != char_t[i]) {
            	return "No";
			}
           
        }
        
        for (int i = 1; i< char_s.length ; i=i+2 ) {
            for (int j = 1; j< char_t.length ; j=j+2 ) {
            	 if(char_s[i] == char_t[j]){
                 	char tem = char_t[i];
                 	char_t[i] = char_t[j];
                 	char_t[j] = tem;
                 	flag = true;
                 	break;
                 }
            }
            if (char_s[i] != char_t[i]) {
            	return "No";
			}
        }
        return "Yes";
    }
    
    public static void main(String[] args) {
		Solution solution = new Solution();
		String twin = solution.isTwin("abcd", "cbad");
		System.out.println(twin);
	}
    
    
}

修改后的逻辑总耗时772ms。

1472. 双胞胎字符串_bc_02


感悟:
在线测试中的第二道题目中:犯了两个错误!!
(1)审题不清楚!没有理清楚其中的逻辑实现,急躁着写出代码逻辑错误!!
(2)题目中没有想好优化的地方,细节决定成败!!缺点!!