[draft]字符串匹配 Z_algorithm

Z algorithm 和字符串匹配的几个算法其实类似,主要利用了pattern的重复信息。

具体思想在这里,这个slides写得非常好懂。

还有个demo也很好。

我实现了一下code(暂时还没去测试是否bugfree难过)

public class ZAlgo {
	
	private int [] z;
	private char [] text;
	
	public ZAlgo() {
		z = null;
		text = null;
	}
	
	private int basicPrefixMatch(int index) {
		int i = 0;
		while (index < text.length && text[index] == text[i]) {
			++i;
			++index;
		}
		return i;
	}	
	//                " a  a  b  c  a  a  b  x  a  a  a  z"
	//                " 0     2     4     6     8     10  "
	// wrong answer:   12, 1, 0, 0, 3, 1, 0, 0, 2, 1, 1, 0  
	// correct answer: 12, 1, 0, 0, 3, 1, 0, 0, 2, 2, 1, 0
	public void populateZ(String str) {
		text = str.toCharArray();
		z = new int[text.length];
		int l = 0;
		int r = 0;
		z[0] = text.length;
		for (int index = 1; index < text.length; ++index) {
			if (index > r) {
				z[index] = basicPrefixMatch(index);
				System.out.printf("a:index = %d, z[index] = %d\n", index, z[index]);
				if (z[index] > 0) {
					l = index;
					r = index + z[index] - 1;
				}
				//print_array('a');
			}else {				
				if (z[index - l]  < r - index + 1) {
					z[index] = z[index - l];
					print_array('b');
				} else {
					int i = r + 1;
					int start = r -index + 1;					
					//System.out.printf("debug:index = %d, i = %d, start = %d\n", index, i, start); 
					// note below: compare text array instead of z value array
					while (i < text.length && text[i] == text[start]) {
						++i;
						++start;
					}
					l = index;
					r = i -1;
					z[index] = r - l +1;
					//print_array('c');
				}
			}
			//System.out.printf("index = %d, l=%d, r=%d%n%n", index, l, r);
		}
	}
	public void print_array(char c) {
		System.out.printf("%c:", c);
		for (int i = 0; i < z.length; ++i) {
			System.out.printf("%d, ", z[i]);
		}
		System.out.println();
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ZAlgo zalgo = new ZAlgo();
		String input = new String("aabcaabxaaaz");
		zalgo.populateZ(input);
		zalgo.print_array('z');
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SELECT DISTINCT c.ID AS id, c.NAME AS contName, c.CONTRACT_NO AS contractNo, c.INSTANCE_ID AS instanceId, c.UNDERTAKE_DEPT_ID AS remindDeptId, c.UNDERTAKE_DEPT_NAME AS sendDeptName, c.CREATE_USER_ID, c.CREATE_USER_NAME AS contractOpteraterName, c.PLAN_STATE AS planState, c.PLAN_STATE_NAME AS planStateName, aw.INSTANCE_ID AS inId, aw.CREATE_TIME AS sendTime FROM ( SELECT c.* FROM ( SELECT c.* FROM ( SELECT c.ORIGINAL_CONTRACT_ID, MAX(CREATE_TIME) CREATE_TIME FROM CONTRACT_DRAFT.C_CONTRACT_INFO c WHERE c.ORIGINAL_CONTRACT_ID IS NOT NULL AND c.ORIGINAL_CONTRACT_ID != '' GROUP BY c.ORIGINAL_CONTRACT_ID ) t LEFT JOIN CONTRACT_DRAFT.C_CONTRACT_INFO c ON t.ORIGINAL_CONTRACT_ID = c.ORIGINAL_CONTRACT_ID AND t.CREATE_TIME = c.CREATE_TIME UNION ALL SELECT c.* FROM CONTRACT_DRAFT.C_CONTRACT_INFO c WHERE ( c.ORIGINAL_CONTRACT_ID IS NULL OR c.ORIGINAL_CONTRACT_ID = '' ) AND c.ID NOT IN ( SELECT c.ORIGINAL_CONTRACT_ID FROM CONTRACT_DRAFT.C_CONTRACT_INFO c WHERE c.ORIGINAL_CONTRACT_ID IS NOT NULL AND c.ORIGINAL_CONTRACT_ID != '')) c WHERE c.deleted_flag = 0 AND c.BELONG = 1 AND sysdate > c.end_date AND c.plan_state IN (4100, 4110, 4120, 4200, 4210, 4220, 5100, 5110, 5120) ) c INNER JOIN (SELECT INSTANCE_ID,create_time,state FROM CONTRACT_DRAFT.C_ACTIVITY_WORKITEMS WHERE state = 'Waiting') aw ON c.INSTANCE_ID = aw.INSTANCE_ID LEFT JOIN (SELECT deleted_flag,CONT_ID FROM CONTRACT_DRAFT.C_GET_PAY_PLAN WHERE deleted_flag = 0 ) g ON c.ID = g.CONT_ID LEFT JOIN CONTRACT_DRAFT.C_OUR_ENTITY_INFO oe ON c.OUR_ENTITY_ID = oe.ID AND oe.DELETED_FLAG = 0 ORDER BY aw.CREATE_TIME DESC 优化
最新发布
07-08

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值