旋变串判断

问题
给定两个字符串,str1和str2判断str2是否是str1的旋变串。
旋变串定义
在这里插入图片描述
示例:
str1 = abcd str2 = acdb
return false;

思想:
分段来看是否护卫旋变串,dp表加上递归。Dp表存0,1,-1值相等为一,不等为-1.
分成俩种四段来比较,顺位的俩段,和逆位置俩段。

代码

public class Code03_ScrambleString {
	
	public static boolean isScramble0(String str1,String str2) {
		if((str1==null&&str2!=null)||(str1!=null&&str2==null)) {
			return false;
		}
		if(str1==null&&str2==null) {
			return true;
		}
		if(str1.length()!=str2.length()) {
			return false;
		}
		char[] s1 = str1.toCharArray();
		char[] s2 = str2.toCharArray();
		return process(s1,0,s1.length,s2,0,s2.length);
	}
	private static boolean process(char[] s1, int L1, int R1, char[] s2, int L2, int R2) {
		if(L1 == R1) {
			return s1[L1] == s2[L2];
		}
		for(int end = L1;end<R1;end++) {
			//正位比较
			boolean p1 = process(s1, L1, end, s2, L2, L2+end-L1)&&process(s1, end+1, R1, s2, L2+end-L1+1, R2);
			//逆位比较
			boolean p2 = process(s1, L1, end, s2, R2-(L2+end-L1)+1, R2)&&process(s1, end+1, R1, s2, L2,R2-(L2+end-L1));
			if(p1||p2) {
				return true;
			}
		}
		return false;
	}
	public static boolean isScramble1(String str1,String str2) {
		if((str1==null&&str2!=null)||(str1!=null&&str2==null)) {
			return false;
		}
		if(str1==null&&str2==null) {
			return true;
		}
		if(str1.length()!=str2.length()) {
			return false;
		}
		char[] s1 = str1.toCharArray();
		char[] s2 = str2.toCharArray();
		int N = s1.length;
		int[][][] dp = new int[N][N][N+1];
		return process1(s1,s2,0,0,N,dp);
	}
	public static boolean process1(char[] s1,char[] s2,int L1,int L2,int size,int[][][] dp) {
		if(dp[L1][L2][size]!=0) {
			return dp[L1][L2][size] == 1;
		}
		boolean ans = false;
		if(size == 1) {
			ans = s1[L1] == s2[L2];
		}
		for(int end = L1;end<size;end++) {
			if((process1(s1,s2, L1+end,L2+end,size-end,dp)&&process1(s1,s2,L1,L2,end,dp))||
					(process1(s1, s2, L1, L2+size-end, end, dp)&&process1(s1, s2, L1+end, L2, size-end, dp))) {
				ans = true;
				break;
			}
		}
		dp[L1][L2][size] = ans?1:-1;
		return ans;
	}
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()) {
			String str1 = scanner.nextLine();
			String str2 = scanner.nextLine();
			boolean ans = isScramble1(str1, str2);
			System.out.println(ans);	
		}

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值