Efficient Algorithm for String Concatenation with Overlap

前端 未结 12 2233
轻奢々
轻奢々 2020-12-02 21:32

We need to combine 3 columns in a database by concatenation. However, the 3 columns may contain overlapping parts and the parts should not be duplicated. For example,

<
12条回答
  •  天命终不由人
    2020-12-02 22:01

    Or you could do it in mysql with the following stored function:

    DELIMITER //
    
    DROP FUNCTION IF EXISTS concat_with_overlap //
    
    CREATE FUNCTION concat_with_overlap(a VARCHAR(100), b VARCHAR(100))
      RETURNS VARCHAR(200) DETERMINISTIC
    BEGIN 
      DECLARE i INT;
      DECLARE al INT;
      DECLARE bl INT;
      SET al = LENGTH(a);
      SET bl = LENGTH(a);
      IF al=0 THEN 
        RETURN b;
      END IF;
      IF bl=0 THEN 
        RETURN a;
      END IF;
      IF al < bl THEN
         SET i = al;
      ELSE
         SET i = bl;
      END IF;
    
      search: WHILE i > 0 DO
         IF RIGHT(a,i) = LEFT(b,i) THEN
        RETURN CONCAT(a, SUBSTR(b,i+1));
         END IF;
         SET i = i - 1;
      END WHILE search;
    
      RETURN CONCAT(a,b);
    END//
    

    I tried it with your test data:

    mysql> select a,b,c,
        -> concat_with_overlap( concat_with_overlap( a, b ), c ) as result 
        -> from testing //
    +-------------+---------+--------+-------------+
    | a           | b       | c      | result      |
    +-------------+---------+--------+-------------+
    | a           | b       | c      | abc         |
    | abcde       | defgh   | ghlmn  | abcdefghlmn |
    | abcdede     | dedefgh |        | abcdedefgh  |
    | abcde       | d       | ghlmn  | abcdedghlmn |
    | abcdef      |         | defghl | abcdefghl   |
    | abXabXabXac | XabXac  |        | abXabXabXac |
    +-------------+---------+--------+-------------+
    6 rows in set (0.00 sec)
    

提交回复
热议问题