文档章节

859. Buddy Strings - LeetCode

yysue
 yysue
发布于 2018/08/24 22:37
字数 285
阅读 80
收藏 0

Question

859. Buddy Strings

Solution

题目大意:

两个字符串,其中一个字符串任意两个字符互换后与另一个字符串相等,只能互换一次

思路:

diff 记录不同字符数

两个字符串长度不同 return false

两个字符串长度相同:
abc abd     无重复,diff == 1  ca[3] != cb[3] return false
abc abc     无重复,diff == 0  return false
ab ba       无重复,diff == 2  return true
aa aa       aa重复,diff == 0  return true
aabc aabc   aa重复,diff == 0  return true
aacb aabc   aa重复,diff == 2  return true

Java实现:

public boolean buddyStrings(String A, String B) {
    if (A.length() != B.length()) return false;
    int[] ca = new int[26];
    int[] cb = new int[26];
    int diff = 0;
    for (int i = 0; i < A.length(); i++) {
        ca[A.charAt(i) - 'a']++;
        cb[B.charAt(i) - 'a']++;
        if (A.charAt(i) != B.charAt(i)) diff++;
    }
    for (int i = 0; i < ca.length; i++) {
        if (diff == 0 && ca[i] > 1) return true;
        if (ca[i] != cb[i]) return false;
    }
    return diff == 2;
}

© 著作权归作者所有

yysue
粉丝 28
博文 273
码字总数 157985
作品 0
济南
程序员
私信 提问
加载中

评论(3)

z7k
z7k

引用来自“z7k”的评论

老哥,我觉得加上这个会更好一些if(A.length() != B.length() || A.length() == 0){
return false ;
}。如果直接for (int i = 0; i < A.length(); i++) 万一A比B长岂不是B.charAt(i)就会报错了。

引用来自“yysue”的评论

if (A.length() != B.length()) return false; 这个条件就把你说的那种情况给过滤掉了
嗯嗯,yes
class Solution {
public static boolean buddyStrings(String A, String B) {
int len = A.length();
//长度不同肯定是不行
if(len != B.length()){
return false;
}
int[] diff = new int[len];
//如果内容一样,则必须有重复字母
if(B.equals(A)){
Set set = new HashSet<>();
for(int i = 0; i < len;i++){
set.add(A.charAt(i));
}
return set.size() < len;
}
int j = 0;
//如果内容不一样,只能允许两处字符不同,并且互相调换顺序还得一样才行
for(int i = 0; i < len; i++){
if(A.charAt(i) != B.charAt(i)){
diff[j++] = i;
}
//若多于两处不同,则可直接返回false
if(j > 2){
return false;
}
}
return j == 2 && A.charAt(diff[0]) == B.charAt(diff[1]) && A.charAt(diff[1]) == B.charAt(diff[0]);
}
}
yysue
yysue 博主

引用来自“z7k”的评论

老哥,我觉得加上这个会更好一些if(A.length() != B.length() || A.length() == 0){
return false ;
}。如果直接for (int i = 0; i < A.length(); i++) 万一A比B长岂不是B.charAt(i)就会报错了。
if (A.length() != B.length()) return false; 这个条件就把你说的那种情况给过滤掉了
z7k
z7k
老哥,我觉得加上这个会更好一些if(A.length() != B.length() || A.length() == 0){
return false ;
}。如果直接for (int i = 0; i < A.length(); i++) 万一A比B长岂不是B.charAt(i)就会报错了。
LeetCode.859-伙伴字符串(Buddy Strings)

这是悦乐书的第330次更新,第354篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第200题(顺位题号是859)。给定两个字母A和B的小写字母,当且仅当我们可以在A中交换两个字母以...

小川94
05/10
0
0
IsomorphicStrings(leetcode205)

Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the characters in s can be replaced to get t. All occurrences of a character must be r......

woshixin
2018/11/29
7
0
Find All Anagrams in a String(leetcode438)

Given a string s and a non-empty string p, find all the start indices of p's anagrams in s. Strings consists of lowercase English letters only and the length of both strings s a......

woshixin
02/12
3
0
两个二进制数相加

陆小凤原创 本文讲解“两个二进制数相加”的算法题。 小白:陆大侠,你想的题目? 际小凤:leetcode的题(https://leetcode.com/),leetcode是可以挑战算法设计的地方。 题目如下: /* Giv...

奇哥十年程序
2018/01/02
0
0
Find the Difference(leetcode389)

Given two strings s and t which consist of only lowercase letters. String t is generated by random shuffling string s and then add one more letter at a random position. Find the......

woshixin
01/09
4
0

没有更多内容

加载失败,请刷新页面

加载更多

喜玛拉雅已听书单

时间倒序排 书名 作者 状态 唐砖 孑与2 进行中 死灵之书(克苏鲁神话合集) 阿卜杜拉·阿尔哈萨德 进行中 赡养人类 刘慈欣 完结 赡养上帝 刘慈欣 完结 中国太阳 刘慈欣 完结 中国太阳 刘慈欣...

Alex_Java
32分钟前
5
0
Java8新特性时间日期库DateTime API及示例

Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理。同样的,如果你现在依旧在项目中使用传统Date、Calendar和SimpleDateFormat等API来处理日期相关操作,这...

程序新视界
42分钟前
7
0
医疗项目pc端后台页面用vue重构整个html页面

页面源码是vue

xintaiideas
今天
6
0
领域驱动中的“贫血症和失忆症” --实践领域驱动--原文

贫血症严重危害着人类健康,并且伴随有危险的副作用。当贫血领域对象被首次提出来时,它并不是一个博得赞美的词汇,它描述的是一个缺少内在行为领域对象。奇怪的是,人们对于贫血领域对象的态...

还仙
今天
6
0
条码打印软件中标签预览正常打印无反应怎么解决

在使用条码打印软件制作标签时,有客户反馈,标签打印预览正常的,但是打印无反应,咨询是怎么回事?今天针对这个情况,可以参考以下方法进行解决。 一、预览正常情况下,打印没反应 (1)在条码...

中琅软件
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部