如何在循环移位后从给定字符串中找到一组不同的字符串?

时间:2016-12-31 08:44:25

标签: c++ string algorithm stl

我在Codeforces中解决[问题] [1],其中问题语句要求我在循环移位后从给定字符串中找到所有不同字符串的集合。 例如: 给定字符串:"abcd" 输出应为4("dabc""cdab""bcda""abcd")[注:"abcd"也计算在内]

所以

t=s[l-1];

for(i=l-1;i>0;i--)
{
    s[i]=s[i-1];
}

s[0]=t;

我将length - 1次上述方法用于所有可能的字符串,但我无法找到明显的字符串,
有没有STL功能呢?

3 个答案:

答案 0 :(得分:3)

您可以使用以下内容:

std::set<std::string>
retrieve_unique_rotations(std::string s)
{
    std::set<std::string> res;

    res.insert(s);
    if (s.empty()) {
        return res;
    }
    for (std::size_t i = 0, size = s.size() - 1; i != size; ++i) {
        std::rotate(s.begin(), s.begin() + 1, s.end());
        res.insert(s);
    }
    return res;
}

Demo

答案 1 :(得分:2)

不确定STL特定的功能,但一般的解决方案可能是在列表中包含所有移位的字符串。然后排序列表,然后迭代列表元素。当前元素与最后一个元素不同时,递增计数器。

可能存在一种内存密集程度较低的解决方案。对于短字符串,这个解决方案就足够了。

答案 2 :(得分:1)

使用vector.push_back(&#34; string&#34;)可以在旋转后使用向量来制作列表。在每次推送之前,您可以使用以下内容检查它是否已存在:

if (std::find(vector.begin(), vector.end(), "string") != v.end()) 
{
increment++;
vector.push_back("string");
}

否则你可以用vector.size()来计算最后的元素;并删除增量++。

希望这有帮助