查找字符串的子字符串的长度

时间:2018-08-28 07:26:17

标签: c string

我想计算一个字符串的子字符串长度。

子串长度是指所有子串的长度,而不是每个单词的长度。

如果输入字符串为UDLRRUUDLRRDUDLRRLUDLRRRUDLRRU

UDLRR-U-UDLRR-D-UDLRR-L-UDLRR-R-UDLRR-U

则输出将为5 x 5 =25。(UDLRR x 5);

如果子字符串大于两个,我想找到整个子字符串长度最大的子字符串。

这意味着UD,UDL,UDLR正在重复执行,但无法最大化子字符串长度。

如何用c在几秒钟内解决?

1 个答案:

答案 0 :(得分:1)

为了使您的工作更轻松,您必须发挥作用。

一般的算法可能是“找到字符串中的所有子字符串,并将字符串中字符最多的子字符串保留在内存中”。

首先,使一个函数知道一个字符串中有多少个子字符串:

size_t GetNbSubstring(const char *haystack, const char *needle)
{
    size_t total     = 0;
    size_t needleLen = strlen(needle);

    if (!haystack || !*haystack || !needle || !*needle) {
        return (0);
    }

    for (char *i = strstr(haystack, needle); i; i = strstr(i, needle)) {
        ++total;
        i += needleLen;
    }

    return (total);
}

现在,我们需要从干草堆的起始位置查找所有可能的子字符串:

void FindSubString(const char *haystack, size_t start)
{
    char needle[strlen(haystack + start) + 1];

    for (size_t i = start; haystack[i]; ++i) {
        needle[i - start] = haystack[i];
        needle[i - start + 1] = '\0';

        size_t nbSubstring = GetNbSubstring(haystack, needle);
        size_t needleLen   = i - start + 1;

        printf("'%s', nbSubstring = %zu, total = %zu * %zu = %zu\n", needle, nbSubstring, needleLen, nbSubstring,  needleLen * nbSubstring);
    }
}

剩下的就是for循环干草堆,以便找到所有可能的子字符串

int main(void)
{
    char *haystack = "UDLRRUUDLRRDUDLRRLUDLRRRUDLRRU";

    for (int i = 0; haystack[i]; ++i) {
        FindSubString(haystack, i);
    }

    return (0);
}

到目前为止,我可以谈谈您的主题,因为有很多未知的地方。 例如,我认为您将希望丢弃出现0或1次的子字符串。 最后,由您决定将“最佳”子字符串保留在内存中,并管理是否有多个解决方案(例如“ AABB”:最佳子字符串“ A”和“ B”)。