给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true ;否则返回 false。——Java实现

题目举例:
示例 1:
输入: A = “ab”, B = “ba”
输出: true

示例 2:
输入: A = “aaaaaaabc”, B = “aaaaaaacb”
输出: true

示例 3:
输入: A = “”, B = “aa”
输出: false

提示:
0 <= A.length <= 20000
0 <= B.length <= 20000
A和B仅由小写字母构成。

Java代码:

package com.renxia.java;

public class rrr {

    public boolean buddyStrings(String A, String B) {
        //两个字符串长度不相等的情况
        if(A.length()!=B.length()){
            return false;
        }

        char[] c1=A.toCharArray();
        char[] c2=B.toCharArray();
        int[] index=new int[3];
        int j=0;

        for(int i=0;i<c1.length;i++){
            if(c1[i]==c2[i]){
                continue;
            }
            else{
                //两个字符串中出现两个以上的字符不同的情况
                index[j++]=i;
                if(j==3){
                    return false;
                }
            }
        }

        //两个字符串完全相同的情况
        if(index[0]==index[1]){
            //单个字符串里出现字母不相同的情况
            for(int k=0;k<c1.length-1;k++){
                for(int kk=1;kk<c1.length;kk++){
                    if(c1[kk]==c1[k]){
                        return true;
                    }
                }
            }
            //单个字符串里字母完全相同
            return false;
        }
        else{
            //两个字符互换后,两个字符串完全相同的情况
            if(c1[index[0]]==c2[index[1]] && c1[index[1]]==c2[index[0]]){
                return true;
            }
            //除上述情况外的其他情况
            return false;
        }
    }

    public static void main(String[] args) {
        System.out.println(new rrr().buddyStrings("ab", "ba"));
        System.out.println(new rrr().buddyStrings("aaaaaaabc", "aaaaaaacb"));
        System.out.println(new rrr().buddyStrings("", "aa"));
        System.out.println(new rrr().buddyStrings("aaa", "aaa"));
        System.out.println(new rrr().buddyStrings("ab", "ab"));
        System.out.println(new rrr().buddyStrings("aab", "aab"));
        System.out.println(new rrr().buddyStrings("aabcdef", "aadfegh"));
    }
}

Java运行结果:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以通过以下方法判断一个字符串是否可以通过在字符串首部加入一些字符 a 而成为回文串: 1. 使用双指针方法,从字符串的两端开始向间遍历,判断对应的字符是否相等。 2. 如果在遍历过程发现不相等字符,则说明该字符串不能通过在字符串首部加入一些字符 a 而成为回文串。 3. 如果遍历完成后所有字符相等,说明该字符串本身就是回文串,不需要在字符串首部加入字符 a。 代码示例: ```python def is_palindrome(s): n = len(s) for i in range(n // 2): if s[i] != s[n - i - 1]: return False return True def can_add_a_to_make_palindrome(s): if is_palindrome(s): return True else: return is_palindrome('a' + s) # 示例 print(can_add_a_to_make_palindrome('abcba')) # True print(can_add_a_to_make_palindrome('abcde')) # False ``` ### 回答2: 判断一个字符串是否可以通过在首部加入字符 a 变成回文串,可以按照以下步骤进行判断: 1. 首先,我们将给定字符串 S 反转得到新的字符串 R。 2. 然后,判断反转后的字符串 R 是否给定字符串 S 相等。 - 如果相等,说明字符串本身就是一个回文串,无需再添加字符 a,返回 True。 - 如果不相等,则继续下一步。 3. 从字符串 S 的首部开始遍历,最少需要添加的字符 a 的个数就是需要添加的字符个数。 - 遍历的过程,如果当前字符与反转后字符串 R 对应位置的字符相等,则跳过,继续向后遍历。 - 如果不相等,则需要添加一个字符 a,然后继续向后遍历。 4. 最终判断需要添加的字符个数是否为 0 或者是 1 个,如果是,则返回 True,否则返回 False。 简单来说,我们通过比较字符串 S 和反转后的字符串 R 的字符是否一致,来确定字符串 S 是不是回文串。如果不一致,我们需要添加字符 a,然后再次比较。最后根据需要添加的字符个数是否为 0 或者是 1 个来判断是否可以通过在首部加入字符 a 变成回文串。 以上是通过逐个比较字符的方法判断的,时间复杂度为 O(n),其 n 是字符串 S 的长度。 ### 回答3: 判断一个字符串能否通过在字符串首部加入字符a成为回文串的方法如下:首先,我们可以定义两个指针,分别指向字符串S的开头(指针i)和末尾(指针j)。然后,我们判断指针i所指向的字符和指针j所指向的字符是否相等,如果相等,则将指针i向后移动一位,指针j向前移动一位;如果不相等,则将指针i保持不动,将字符a插入到指针j的位置,并将指针j向前移动一位。重复上述过程,直到指针i和指针j相遇为止。 如果在整个过程,指针i和指针j始终指向相同的字符,则说明字符串S本身就是一个回文串,不需要在字符串首部加入字符a;如果指针i和指针j相遇时,指针i在指针j的左边,则说明字符串S可以通过在字符串首部加入字符a成为回文串,否则,无法通过在字符串首部加入字符a使得字符串S成为回文串。 通过这种方法,我们可以判断一个字符串能否通过在字符串首部加入字符a成为回文串,并且可以在O(n)的时间复杂度下完成。其,n表示字符串S的长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值