1.问题
判断一个字符串A是否为另一个字符串B的Sub_Anagram?
输入:两个字符串
输出:true 或者false
2.相关概念
Anagrames:同词异序,即两个字符串包含相同的字符,但字符在两个字符串内的顺序是不同的。eg:"hello","elloh","llohe","ohell"等等。
Sub_Anagrames:B字符串的长度要小于A字符串的长度,B字符串中不能出现A字符串中没出现过的字符,若B字符串出现了A字符串内的某个字符,该字符在B字符串中出现的次数不能大于在A字符串中出现的次数。
eg: 输入:A="hello",B="hell"或“ell”或“eo”或"o"等等
输出:true
3.算法基本思想
1.将A串所有长度为B串长度的子串找出来。
2.循环比较B串是否满足所有子串中的某一个子串(此处简记为 s)的乱序,若满足则输出True,否则False。
补:step2中判断的标准是每个字母在B串和s串中出现的次数是否相等。
4.算法复杂度
....
5.代码:
1.SubAna类
import java.util.HashMap;
public class SubAna {
private final int length;//字符串长度
//private final char[] apa;//字符数组
private final HashMap<Character,Integer> hashMap=new HashMap<>();//字符次数
private final String str;//字符串
public SubAna(String str){
this.str=str;
length=str.length();
// apa=str.toCharArray();
int count;
for (int i = 0; i < length; i++) {
if(hashMap.get(str.charAt(i))==null){
count=1;
}else{
count=hashMap.get(str.charAt(i))+1;
}
hashMap.put(str.charAt(i),count);
}
}
public String[] GetSubString(int len,String str){
String[] s=new String[1+str.length()-len];
for (int i = 0; i < 1+str.length()-len;i++) {
s[i]=str.substring(i,i+len);
}
return s;
}
public int getLength() {
return length;
}
// public char[] getApa() {
//
// return apa;
// }
public char getCharAt(int i){
return str.charAt(i);
}
public String getStr(){
return str;
}
public HashMap<Character, Integer> getHashMap() {
return hashMap;
}
}
2.SubAnaTest类
1.SubAna类
public class SubAna {
private final int length;//字符串长度
//private final char[] apa;//字符数组
private final HashMap<Character,Integer> hashMap=new HashMap<>();//字符次数
private final String str;//字符串
public SubAna(String str){
this.str=str;
length=str.length();
// apa=str.toCharArray();
int count;
for (int i = 0; i < length; i++) {
if(hashMap.get(str.charAt(i))==null){
count=1;
}else{
count=hashMap.get(str.charAt(i))+1;
}
hashMap.put(str.charAt(i),count);
}
}
public String[] GetSubString(int len,String str){
String[] s=new String[1+str.length()-len];
for (int i = 0; i < 1+str.length()-len;i++) {
s[i]=str.substring(i,i+len);
}
return s;
}
public int getLength() {
return length;
}
// public char[] getApa() {
//
// return apa;
// }
public char getCharAt(int i){
return str.charAt(i);
}
public String getStr(){
return str;
}
public HashMap<Character, Integer> getHashMap() {
return hashMap;
}
}
2.SubAnaTest1类:
import java.util.Arrays;
import java.util.Scanner;
public class SubAnaTest1 {
private static int MaxSize=100;
public static String putIn(){
Scanner scanner=new Scanner(System.in);
return scanner.nextLine();
//.toLowerCase();
}
public static int Kmp(SubAna str1,SubAna str2){
int []next=new int[MaxSize];
int i=0,j=0;
String str=str2.getStr();
//str2.GetNext(next,str);
while(i<str1.getLength()&&j<str2.getLength())
{
if(j==-1 || str1.getCharAt(i)==str2.getCharAt(j))
{
i++;
j++;
}
else j=next[j]; //j回退。。。
}
if(j>= str2.getLength())
return (i- str2.getLength()); //匹配成功,返回子串的位置
else
return (-1); //没找到
}
public static void main(String[] args) {
//输入字符串A,B
System.out.println("________________本程序判断B字符串是否为A字符串的Sub_Ana_______________");
System.out.println("请输入A字符串:");
SubAna A=new SubAna(putIn());
System.out.println("请输入B字符串:");
SubAna B=new SubAna(putIn());
//判断字符串B是不字符串A的Sub_Ana
//long starTime=System.nanoTime();
num: if(B.getLength()<A.getLength()){//A,B长度判断
// for (int i = 0; i < B.getLength(); i++) {
// //A,B中字母出现的次数判断
// if(A.getHashMap().get(B.getCharAt(i))==null|| B.getHashMap().get(B.getCharAt(i))>A.getHashMap().get(B.getCharAt(i))){
// System.out.println("False");break num;
// }
// }
int flag=0;
String[]arrays=A.GetSubString(B.getLength(),A.getStr());
for (int i = 0; i < arrays.length; i++) {
// SubAna subAna=new SubAna(arrays[i]);
// if(subAna)
Arrays.sort(arrays[i].toCharArray());
Arrays.sort(B.getStr().toCharArray());
System.out.println(arrays[i]);
System.out.println(B.getStr());
if(arrays[i].compareTo(B.getStr())!=0){
flag++;
System.out.println(flag);
}
}
System.out.println(flag+" "+arrays.length);
if(flag==arrays.length){
System.out.println("False");break num;
}
else {
System.out.println("True");
}
}
else {
System.out.println("False");
}
// long endTime=System.nanoTime();
// long durTime=endTime-starTime;
// System.out.println(durTime+"纳秒");
}
}
6.测试