题目
给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样且每种字符出现的次数也一样,那么str1和str2互为变形词。请实现函数判断两个字符串是否互为变形词。
例如:
- str1="132",str2="321",返回true
- str1="123",str2="2331",返回false
难度:?
就这样吧
设计
- 一个接收两个字符串的判断并返回布尔值的方法
boolean isDeformation(String str1,String str2){}
- 互为变形词实质上就是判断两字符串长度是否等同,与字符是否共同出现过,当然共同出现的字符个数是否相等
- 先从简单的入手,设置第一层过滤条件
if(str1 == null || str2 == null || str1.length() != str2.length()){ return false; }
- 将字符串转换为字符数组存储,方便遍历及校对工作
str1.toCharArray(); str2.toCharArray();
- 进行字符数组遍历
/** * 相同的字符替换抹去,跳出当前循环,外层循环继续遍历比对 */ for (char char1 : str1.toCharArray()) { boolean isSameChar = false; for (char char2 : str2.toCharArray()) { if (char1 == char2) { str2 = str2.replaceFirst(String.valueOf(char2), ""); //此flag标记已影响下一层的 isSameChar 变量值 isSameChar = true; break; } } /** * 比对过程中总有相同的字符,然而并不是所有的字符都相同 ,所以还是置为false * 若是满足isSameChar都为true的过程,且退出外层循环,直接返回true便是 * */ if (!isSameChar) { return false; } }
实现
import org.junit.Assert;
import org.junit.Test;
/**
* @author lorem
* 类名无特殊含义,取自无聊的动漫罢了
*/
public class LucyStarTest {
@Test
public void test(){
String str1 = null;
String str2 = null;
Assert.assertFalse(isDeformation(str1, str2));
}
private boolean isDeformation(String str1, String str2){
if (str2 == null || str1 == null || str1.length() != str2.length()){
return false;
}
for (char char1:str1.toCharArray()) {
boolean isSameChar = false;
for (char char2:str2.toCharArray()) {
if (char1 == char2){
str2 = str2.replaceFirst(String.valueOf(char2),"");
isSameChar = true;
break;
}
}
if (!isSameChar){
return false;
}
}
return true;
}
}
感谢好朋友的帮助:DreamBroke
拙
设计 (拙)
- 一个接收两个字符串的判断并返回布尔值的方法
boolean isDeformation(String str1,String str2){}
- 互为变形词实质上就是判断两字符串长度是否等同,与字符是否共同出现过,当然共同出现的字符个数是否相等
- 先从简单的入手,设置第一层过滤条件
if(str1 == null || str2 == null || str1.length() != str2.length()){ return false; }
- 比对两个字符串变量中的每个字母是否共同出现过(ASCII)
- 将字符串作为字符数组存储
java char[] chars1 = str1.toCharArray(); char[] chars2 = str2.toCharArray();
- 一个记录字符出现频次的计数器,字符作为独立的个体存在,还是需要用数组作为每个字符出现频次的计数器,这篇资料 ASCII码 很好的说明了ASCII的取值范围
java int[] ints = new int[256];
- 记录字符的出现频次
- 记录str1的字符出现频次
for (int i = 0; i < chars1.length; i++) { ints[chars1[i]]++; }
- 再以此进行比对 str2 的字符出现频次
for (int i = 0; i < chars2.length; i++) { if(ints[chars2[i]] == 0){ return false; } else { ints[chars2[i]]--; } } /** 满足条件跳出并返回true */ return true;
- 将字符串作为字符数组存储
实现(拙)
import org.junit.Assert;
import org.junit.Test;
/**
* @author lorem
*/
public class StringStringGoTest {
boolean isDeformation(String str1, String str2) {
if (str1 == null || str2 == null || str1.length() != str2.length()) {
return false;
}
char[] chars1 = str1.toCharArray();
char[] chars2 = str2.toCharArray();
int[] ints = new int[256];
for (int i = 0; i < chars1.length; i++) {
ints[chars1[i]]++;
}
for (int i = 0; i < chars2.length; i++) {
if (ints[chars2[i]] == 0) {
return false;
}else {
ints[chars2[i]]--;
}
}
return true;
}
@Test
public void test(){
String str1 = "asd";
String str2 = "asd";
Assert.assertEquals(true,isDeformation(str1,str2));
}
}