c++ - 查找字符串中字典序最大的旋转

标签 c++ string lexicographic

我需要从给定的输入字符串中找出字典序最大的字符串。 所以如果输入是

enjoy

应该是o/p

yenjo

我试过的代码是....

int n;
cout<<"Enter the number of strings";
cin>>n;
int len[n];
char str[n][1000];
for(int i=0;i<n;i++)
{
    cin>>str[i];
    len[i]=strlen(str[i]);
}
int num,pos[n];
for(int i=0;i<n;i++)
{
    pos[i]=0;
    num=int(str[i][0]);
    for(int j=1;j<len[i];j++)
    {
       if(int(str[i][j])>num)
        {
           num=int(str[i][j]);
           pos[i]=j;
       }   
    }    
}
int i,j,k;
char temp[1];
for(i=0;i<n;i++)
{
    for(j=0;j<pos[i];j++)
        {
        temp[0]=str[i][0];
        for(k=0;k<len[i];k++)
         {
            str[i][k]=str[i][k+1];
        }
        strcat(str[i],temp);
        str[i][len[i]]='\0';
    }
    cout<<str[i]<<"\n";
}
return 0;
}

但是这段代码只检查最大的数字而不检查它旁边的数字,因此 i/p 失败

blowhowler

o/p 应该是 wlerblowho 但我得到的 o/p 是 whowlerblo
如何跟踪最大字符之前的每个元素以获得正确的输出?

最佳答案

为了在平均情况下获得良好的性能(实际上是 O(N)),但在最坏的情况下仍然是 O^2(并且始终正确),您可以跟踪可能性,并在进行时不断消除它们。基本上是这样的。

struct PermSum
{
  int sum;
  int perm;
}

LinkedList<PermSum> L;

for(int i = 0; i != input.size(); ++i) L.append(PermSum{0,i});

int depth = 0;
int max = 0;
const int length = input.size()
while(L.size() > 1 && depth < length)
{
  for(l in L)
  {
    l.sum += input[(l.perm + depth) % length]
    if (l.sum > max) max = l.sum
  }

  for(l in L)
  {
    if (l.sum < max) L.delete(l)
  }
  depth ++;
}

if (L.size() == 1)
  return L.front().perm
else
  return -1

我在 C++ 代码的某些部分有点懒惰,但我相信您可以找出 for l in L。关键行是第一个 for 循环。这个想法是它在第 l.perm-th 排列的第 depth-th 个字母处添加字典序值。通过这种方式,它会更新所有可能性,同时跟踪最佳可能性的级别。然后,您进行第二遍以删除任何达不到最佳效果的可能性。值得注意的是,我编写代码的方式可能使用与循环排列的标准约定相反的方式。也就是说,我程序中的 perm 字段表示循环移动左移的点数,而通常正数是循环右移。您可以在某处使用减号来解决此问题。

至于运行时间分析,基本和Quickselect是同一个论点。每个 while 循环迭代花费的时间与 L 的长度成正比。第一次迭代,L 将始终具有长度 = N(其中 N 是字符串的长度,与代码中的变量长度相同)。下一轮,我们通常只期望 1/26 的数据通过,下一轮又是 1/26...所以我们有 N(1 + 1/26 + 2/26^2...)是 O(N)。

关于c++ - 查找字符串中字典序最大的旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25901657/

相关文章:

c - 在c中按字典顺序对字符串进行排序

c++ - RayTracing,Phong模型/镜面照明不起作用?

c++ - 无法使用opencv加载大图像

java - 在Java中,如何将字符串中的所有单词转换为句子大小写?

字符串格式化过程与writeln类似

java - Java 中的字符串比较

C++:如果 std::atomic_flag 是唯一的无锁原子类型,如何在 C++ 中实现无锁数据结构?

c++ - 更改 CMAKE_CXX_FLAGS_DEBUG 和 CMake 中的 friend 的默认值

c - ANSI C,没有可变参数函数的整数到字符串

Python:从范围(n)生成k元组,仅按顺序包含元组