判断一个字符串是否为另一个字符串的Sub_Anagrames

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.测试

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值