【问题标题】:how to find set of distinct strings from a given string after cyclic shifts?如何在循环移位后从给定字符串中找到一组不同的字符串?
【发布时间】:2016-12-31 08:44:25
【问题描述】:

我正在解决 Codeforces 中的 [QUESTION][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 函数可以做到这一点?

【问题讨论】:

  • std::set<std::string> 可能会有所帮助。
  • 感谢您的回复!

标签: c++ string algorithm stl


【解决方案1】:

您可以使用以下内容:

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

【讨论】:

    【解决方案2】:

    不确定 STL 特定的函数,但是一般的解决方案可能是将所有移位的字符串放在一个列表中。然后对列表进行排序,然后遍历列表元素。当当前元素与上一个元素不同时,递增计数器。

    可能有一种内存占用较少的解决方案。对于短字符串,这个解决方案应该足够了。

    【讨论】:

      【解决方案3】:

      你可以通过vector.push_back("string")在旋转后使用vector制作一个列表。在每次推送之前,您可以使用以下方式检查它是否已经存在:

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

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

      希望对你有帮助

      【讨论】:

      • 感谢您的回复!
      • std::setstd::unordered_set 效率更高时,为什么还要使用vector?想象一下,如果字符串是 1000 个字符而不是 6 个字符。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 2018-12-15
      • 2013-09-11
      • 2014-05-24
      • 1970-01-01
      相关资源
      最近更新 更多