我想计算一个字符串的子字符串长度。
子串长度是指所有子串的长度,而不是每个单词的长度。
如果输入字符串为UDLRRUUDLRRDUDLRRLUDLRRRUDLRRU
,
UDLRR-U-UDLRR-D-UDLRR-L-UDLRR-R-UDLRR-U
则输出将为5 x 5 =25。(UDLRR x 5);
如果子字符串大于两个,我想找到整个子字符串长度最大的子字符串。
这意味着UD,UDL,UDLR正在重复执行,但无法最大化子字符串长度。
如何用c在几秒钟内解决?
答案 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”)。