Java 如何在字符串或表列中查找未知的重复子字符串

Java 如何在字符串或表列中查找未知的重复子字符串,java,algorithm,plsql,oracle11g,Java,Algorithm,Plsql,Oracle11g,我有一个大的数字字符串,它是程序的输入(我假设序列名是“S”),它可以是字符串,也可以是表列。 由类似表格的表格生成的输入字符串。 我想找到构成“S”字符串的未知子字符串。 每个子字符串由100个数字组成 我们将示例简化如下:每个子字符串包含三个数字,而不是100个数字 表: 表1说明: 表1的每一行都属于在“s”中重复的子字符串之一。 对于每一列,我们正好有十个数字,这些数字由随机重复的数字组成,属于该列。 例如: 对于第一列,我们可以有四个11和六个65,或者一个11和九个65等等,其他的

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

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

表:

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

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


有人能帮我用pl_sql或java来解决这个问题吗

这里有一些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;
/
打开服务器输出;
声明
类型编号为INT(2)表;
类型输出是VARCHAR2(100)的表;
c_示例VARCHAR2(160):=“11111111111111656565101010303066666666661340630306066666616113030303030666666131313134040406150505050505050505065651116666666666”;
c_place INT:=1;
c_chunk INT:=1;
l_numbers_t:=numbers_t();
l_output_t:=output_t();
n个二进制整数;
开始
l_输出扩展(3);

c_place Try code from this article:您需要澄清这个问题:如何确定一个数字属于哪一行,F.i.如何确定您突出显示的50上下都有一个空值。尽可能多地提供信息,这还不够清楚
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;
/