【问题标题】:How to find unknown repeated substring in string or table column如何在字符串或表格列中查找未知的重复子字符串
【发布时间】:2016-10-30 08:16:15
【问题描述】:

我有一大串数字作为程序的输入(我假设序列名称是“S”),它可以是字符串,也可以是表格列。 由表生成的输入字符串 (S),如表 1
我想找到构成“S”字符串的未知子字符串。 每个子字符串由 100 个数字组成。

我们将示例简化如下:每个子字符串包含三个数字而不是 100 个数字。

1:

表 1 说明: 表 1 的每一行都属于在“s”字符串中重复的子字符串之一。 对于每一列,我们恰好有十个数字,这些数字由随机重复的数字组成,属于该列。 例如: 对于第一列,我们可以有例如四个 11 和六个 65 或一个 11 和九个 65 等,其他列完全一样。对于每十个重复一个数字的列,该数字例如第七列如下所示: 50 50 50 50 50 50 50 50 50 50 。

输出是组成“S”字符串的重复子字符串。 输出:

11,10,13
30,40,50
65,66,61

谁能帮我用 pl_sql 或 java 来解决这个问题。

【问题讨论】:

  • 试用本文中的代码:stackoverflow.com/questions/10286677/…
  • 你需要澄清这个问题:如何确定一个数字属于哪一行,F.i.如何确定您突出显示的 50 上下有一个空值。提供尽可能多的信息,这还不够清楚

标签: java algorithm plsql oracle11g


【解决方案1】:

这里有一些 PL/SQL,我相信它们可以解决您所描述的基本问题。我认为它将扩展到您更大的数据集,但我不得不对将数字分组做出一些假设。基本流程适用于您提供的数据、描述和结果。

SET SERVEROUTPUT ON;

DECLARE
    TYPE numbers_t IS TABLE OF INT(2);
    TYPE output_t  IS TABLE OF VARCHAR2(100);

    c_example VARCHAR2(160) := '1111111111111165656510101030306666666666134061134061616161611030303030306666666613131313134040404061505050505050505050506565656565656565656511111166666666666666';
    c_place   INT := 1;
    c_chunk   INT := 1;
    l_numbers numbers_t := numbers_t();
    l_output  output_t  := output_t();
    n binary_integer;

BEGIN
    l_output.EXTEND(3);
    WHILE c_place <= LENGTH(c_example)
    LOOP
        l_numbers.EXTEND(10);
        WHILE c_chunk <= 10
        LOOP
            l_numbers(c_chunk) := SUBSTR(c_example, c_place, 2);
            c_place := c_place + 2;
            c_chunk := c_chunk + 1;
        END LOOP;
        c_chunk := 1;
        l_numbers := SET(l_numbers);
        n := l_numbers.FIRST;
        WHILE (n IS NOT NULL)
        LOOP
                CASE
                WHEN l_numbers(n) < 30 THEN l_output(1) := l_output(1) || ',' || l_numbers(n);
                WHEN l_numbers(n) > 50 THEN l_output(3) := l_output(3) || ',' || l_numbers(n);
                ELSE l_output(2) := l_output(2) || ',' || l_numbers(n);
            END CASE;
            n := l_numbers.NEXT(n);
        END LOOP;
        l_numbers.DELETE();
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(TRIM(LEADING ',' FROM l_output(1)));
    DBMS_OUTPUT.PUT_LINE(TRIM(LEADING ',' FROM l_output(2)));
    DBMS_OUTPUT.PUT_LINE(TRIM(LEADING ',' FROM l_output(3)));
END;
/

【讨论】:

    猜你喜欢
    • 2019-11-17
    • 1970-01-01
    • 2021-04-21
    • 2014-05-09
    • 2020-10-19
    • 2020-02-24
    • 2016-11-22
    • 2012-05-16
    相关资源
    最近更新 更多