package com.model.string; import org.omg.PortableInterceptor.INACTIVE; import java.util.HashMap; /** * @Description:测试类 * @Author: 张紫韩 * @Crete 2021/8/31 23:11 * 给你两个字符串,找到同源异构字符串 * acbd 和abc 即 acb为abc的同源异构字符串 */ public class StringDemo01 { public static void main(String[] args) { String str1="fasdfsdabcdefg"; String str2="bca"; System.out.println(getIndex(str1, str2)); System.out.println(getIndex2(str1, str2)); } // 窗口移动+记账法 public static int getIndex2(String str1,String str2){ if (str1.length()<str2.length()||str2.length()==0){ return -1; } int[] table=new int[256]; // 无效还款数 int invalid=0; // 形成账单 for (int i = 0; i < str2.length(); i++) { table[str2.charAt(i)]++; } // 先行成第一个窗口 for (int i = 0; i < str2.length(); i++) { if (table[str1.charAt(i)]==0){ invalid++; } table[str1.charAt(i)]--; } if (invalid==0){ return 0; } for (int i = 0;i < str1.length()-str2.length()+1; i++) { // 判断是否已经全部还款,且无效还款为0 if (invalid==0){ return i; } // 滑动窗口 if (table[str1.charAt(i)]++<0){ invalid--; } if (table[str1.charAt(i+str2.length())]--==0){ invalid++; } } return -1; } //普通方法,列举出所有的和str2一样长的字串进行比对 public static int getIndex(String str1,String str2){ for (int i = 0; i < str1.length()-str2.length()+1; i++) { if (isTY(str1.substring(i, i+str2.length()), str2)){ return i; } } return -1; } // 判断两个字符串是否是同源字符串 public static boolean isTY(String str1,String str2){ int[] table=new int[256]; for (int i = 0; i < str2.length(); i++) { table[str2.charAt(i)]++; } for (int i = 0; i < str1.length(); i++) { if (table[str1.charAt(i)]==0){ return false; } table[str1.charAt(i)]--; } return true; } }