PLSQL实现两个字符串匹配 3

功能:找出字符串l_b中字母在字符串l_a中存在的字母
思路:先把字母转换成素数,然后用l_a的积除以l_b中的每个字母对应的素数,余数为0则表示存在。

/********************************************
找出字符串l_b中字母在字符串l_a中存在的字母
**********************************************/
DECLARE
l_a Varchar2(50) := 'ADEFGHIKX';
l_b VARCHAR2(50) := 'EDGLKJOS';
l_length NUMBER;
l_length2 NUMBER;
v VARCHAR2(1);
TYPE l_num_table IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
l_num l_num_table;
l_count NUMBER;
l_sum  NUMBER;
BEGIN
  --A-Z转换成前26位素数
  l_sum := 1;
  l_count := 0;
  l_num(1) := 2;
  l_num(2) := 3;
  l_num(3) := 5;
  l_num(4) := 7;
  l_num(5) := 11;
  l_num(6) := 13;
  l_num(7) := 17;
  l_num(8) := 19;
  l_num(9) := 23;
  l_num(10) := 29;
  l_num(11) := 31;
  l_num(12) := 37;
  l_num(13) := 41;
  l_num(14) := 43;
  l_num(15) := 47;
  l_num(16) := 53;
  l_num(17) := 59;
  l_num(18) := 61;
  l_num(19) := 67;
  l_num(20) := 71;
  l_num(21) := 73;
  l_num(22) := 79;
  l_num(23) := 83;
  l_num(24) := 89;
  l_num(25) := 97;
  l_num(26) := 101;
  
  l_length := LENGTH(l_a);
  l_length2 := LENGTH(l_b);
  
  --求字符串l_a中字母对应的素数积
  FOR i IN 1..l_length LOOP
    v := SUBSTRB(l_a,1,1);
    l_a := SUBSTRB(l_a,2,l_length);
    dbms_output.put_line(ASCII(v)-ASCII('A') + 1);
    l_sum := l_sum * l_num(ASCII(v)-ASCII('A') + 1);
  END LOOP;
  
  --用l_a中的积除以l_b中的每个字母,判断是否存在
  FOR i IN 1..l_length2 LOOP
    v := SUBSTRB(l_b,1,1);
    l_b := SUBSTRB(l_b,2,l_length2);
    l_count := l_count + 1;
    IF MOD(l_sum,l_num(ASCII(v)-ASCII('A') + 1)) = 0 THEN 
      dbms_output.put(v || ' ');
    END IF;
  END LOOP;
  dbms_output.put_line(l_count);
END;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28268054/viewspace-1075805/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/28268054/viewspace-1075805/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值