原文

Given two strings, write a method to decide if one is a permutation of the other.

译文

给你两个字符串,写一个方法来判断其中一个是不是另一个的permutation。如果两个字符串含有相同的字符,仅仅是顺序可能不同,那么他们就叫permutations。例如"ABCDEF"和"FEDCBA",我们可以认为它们是permutation。

解答

如果长度不同,则一定不是,否则我们可以先将两个字符串内的字符按字典序排序,然后再判断是否相等。

import java.util.Arrays;

public class Main {

    public static boolean isPermutation (String s1, String s2) {
if(s1.length() != s2.length())
return false;
if(s1.equals(s2))
return true;
char a[] = s1.toCharArray();
char b[] = s2.toCharArray();
Arrays.sort(a);
Arrays.sort(b);
return Arrays.toString(a).equals(Arrays.toString(b));
} public static void main(String args[]) {
String s1 = "ABCDEF";
String s2 = "FEDCBA";
String s3 = "ABCDEE";
System.out.println(isPermutation(s1,s2));
System.out.println(isPermutation(s1,s3));
}
}

O(n)的解法

由于组成变位词的字符是一模一样的, 因此我们可以先统计每个字符串中各个字符出现的次数, 然后看这两个字符串中各字符出现次数是否一样。如果是,则它们是一对变位词。 这需要开一个辅助数组来保存各字符的出现次数。我们可以开一个大小是256的整数数组, 遍历第一个字符串时,将相应字符出现的次数加1;遍历第二个字符串时, 将相应字符出现的次数减1。最后如果数组中256个数都为0,说明两个字符串是一对变位词。 (第1个字符串中出现的字符都被第2个字符串出现的字符抵消了), 如果数组中有一个不为0,说明它们不是一对变位词。

public static boolean isPermutation2 (String s1, String s2) {
int len = s1.length();
if(len != s2.length())
return false;
if(s1.equals(s2))
return true;
int [] count = new int[256];
for(int i = 0; i < 256; i++) {
count[i] = 0;
}
for(int i = 0; i < len; i++) {
count[s1.charAt(i)]++;
count[s2.charAt(i)]--;
}
for(int i = 0; i < 256; i++) {
if(count[i] != 0)
return false;
}
return true;
}

最新文章

  1. D3中数据与DOM element绑定之data() enter() exit()浅析
  2. TSwitch 中文简繁显示支持(XE6 Android)
  3. WAMP环境启动失败处理办法
  4. 程序员书单_HTML篇
  5. RunJS - 在线编辑、展示、分享、交流你的 JavaScript 代码
  6. 收回动态VHD的未使用空间
  7. crm踩坑记(二)
  8. [Swift]LeetCode308. 二维区域和检索 - 可变 $ Range Sum Query 2D - Mutable
  9. WebBrowser引用IE版本问题,更改使用高版本IE
  10. 24 Zabbix系统配置日志监控告警--关键字触发
  11. RCC 和 RTC
  12. Winfrom窗体无法关闭问题--检查是否存在重写
  13. PAT 乙级 1054 求平均值 (20) C++版
  14. php email
  15. Android 国内集成使用谷歌地图
  16. python3:定时执行自动化测试脚本
  17. php实现菲波那切数列和杨辉三角
  18. Kubernetes集群中Service的滚动更新
  19. streamsets 数据流设计
  20. TFS文件编码检查机制和修改(Team Foundation Server 2013)

热门文章

  1. [置顶] Putty管理私钥文件
  2. mysql如何删除重复记录
  3. kubernetes组件
  4. Facebook的手游出海之道
  5. [转] linux 信号量之SIGNAL
  6. GCC编译选项
  7. ASP.NET页面周期
  8. Flask挺好
  9. 华为S5300交换机配置基于VLAN的本地端口镜像
  10. Swift - 41 - swift1.2新特性(1)