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,这是不争取的!!
为了提高效率,修改其中的业务逻辑
后期发现其中逻辑错误:修改后的代码如下,通过!!
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。
感悟:
在线测试中的第二道题目中:犯了两个错误!!
(1)审题不清楚!没有理清楚其中的逻辑实现,急躁着写出代码逻辑错误!!
(2)题目中没有想好优化的地方,细节决定成败!!缺点!!