字符串之变形数
2015-11-03 21:17
232 查看
字符串之变形数
题目:给定2个字符串str1和str2,如果str1和str2出现的字符种类和每个字符出现的个数也一样,那么str1与str2互为变形数。请用函数实现。例子:str1="123", str2="231" 返回 true
例子:str1="123", str2="2311" 返回 false;
解题思路
方法1:如果字符串str1和str2长度不一样肯定不是变形数,如果相等的话,假设出现的的字符编码为0~256,申请一个长度为256的整形数组map,map[a]=b,表示字符a出现了b次,然后遍历str1,比如遍历到‘a’,那么是a[97]++,,然后遍历str2,当遍历到‘a’,那么map[97]--,如果其中只要有一种情况小于0,那么肯定不是变形数字了,如果想不通,慢慢想,总会想得通的,加油。
方法2:既然str1和str2可以转换成字符编码0~256,而且每个可以把每个字符的编码加起来,如果2个字符编码都相等的话,那么是变形数,前提是字符串的长度是一样的的,以防1+2+3=2+4;的情况出现。
下面是实现的java代码
public class Changeword { public static void main(String[] args) { String str1="abcd",str2="abcdd",str3="abcd"; System.out.println("str1和str2是变形数吗?"+isChangeWord1(str1,str2)); System.out.println("str2和str3是变形数吗?"+isChangeWord1(str2,str3)); System.out.println("str1和str3是变形数吗?"+isChangeWord1(str1,str3)); System.out.println("str1和str2是变形数吗?"+isChangeWord2(str1,str2)); System.out.println("str2和str3是变形数吗?"+isChangeWord2(str2,str3)); System.out.println("str1和str3是变形数吗?"+isChangeWord2(str1,str3)); } //判断是否为变形数 public static boolean isChangeWord1(String str1,String str2){ if(str1 ==null|| str2 == null || str1.length()!=str2.length()){ //字符串为空和长度都不想等,怎么可能是变形数字 return false; } char[] chars1=str1.toCharArray(); char[] chars2=str2.toCharArray(); int [] map=new int[256]; //map[a]=b;表现a出现了b次,因为字符编码在0到256之间 for(int i=0;i<chars1.length;i++){ map[chars1[i]]++; } for(int i=0;i<chars2.length;i++){ if(map[chars2[i]]--<0){ return false; } } return true; } //判断是否为变形数 public static boolean isChangeWord2(String str1,String str2){ if(str1 ==null|| str2 == null || str1.length()!=str2.length()){ //字符串为空和长度都不想等,怎么可能是变形数字 return false; } char[] chars1=str1.toCharArray(); char[] chars2=str2.toCharArray(); int sum1=0; int sum2=0; for(int i=0;i<chars1.length;i++){ sum1+=chars1[i]; } for(int i=0;i<chars2.length;i++){ sum2+=chars2[i]; } if(sum1!=sum2){ return false; } return true; } }
结果:
str1和str2是变形数吗?false
str2和str3是变形数吗?false
str1和str3是变形数吗?true
str1和str2是变形数吗?false
str2和str3是变形数吗?false
str1和str3是变形数吗?true
相关文章推荐
- Universal-Image-Loader异步加载图片详解
- 学习笔记-冒泡排序 14/12/29
- CentOS 6.3下配置LVM(逻辑卷管理)
- Android AsyncTask 浅析(源代码取自 API level 23)
- 1022D进制的A+B
- openCV教程03
- java关键字
- 零碎知识点
- hdu1503 Advanced Fruits (简单LCS)
- poj 2528 Mayor’s posters 线段树
- Selinux在Enforcing mode切到root
- 1021个位数统计
- openCV教程02
- Custom InputFormat
- select下拉联动(2) 更具级联性
- 在二维数组中查找数
- Linux Shell中的延时函数 sleep
- 线性表的链状存储结构的实现
- LeetCode 015 3Sum
- ARP数据包格式