按字母顺序排列的字符串

Posted

技术标签:

【中文标题】按字母顺序排列的字符串【英文标题】:string in alphabetical order 【发布时间】:2014-08-22 16:19:41 【问题描述】:

我正在尝试使用递归函数按字母顺序打印字符串,但它给出的字符串下标超出范围错误。

string alpha(string word)

    char temp;
    int count = 0;
    int i = 0;

    while (count < word.size())
    
        if (word[i] > word[i + 1])
        
            temp = word[i];
            word[i] = word[i + 1];
            word[i + 1] = temp;
            i++;
            if (i >= word.size())
            
                alpha(word);
            
        
        else
        
            count++;
        
    
    return word;

【问题讨论】:

为什么不使用std::sort 问题是word[i + 1]。当您的 i 达到最大索引时,这会将您推到它之外。 因为我想做一个函数 while (count &lt; word.size() - 1) i++; if (word[i] &gt; word[i + 1]) temp = word[i]; word[i] = word[i + 1]; word[i + 1] = temp; else if (i &gt;= word.size()) alpha(word); else count++; return word; @JonThemon 即使您确实创建了自己的函数,也绝对没有理由使用内联交换而不是使用std::swap。顺便说一句,这不是按字母顺序排列的。 “ABab”不应保持这种状态。 【参考方案1】:

因为您使用if (word[i] &gt; word[i + 1]),所以您必须在循环结束前停止循环...并且您需要counti(不能同时使用两者);那是

while (i + 1 < word.size()) // <-- like so

或者你可以使用

int i = 1;
while (i < word.size()) 
  if (word[i - 1] > word[i]) 

【讨论】:

【参考方案2】:

我会这样做:

std::string alpha(std::string s)

    std::sort(s.begin(), s.end());
    return s;

Demo

如果你想自己实现一个O(n²) 排序算法,你可以这样做:

std::string alpha(std::string word)

    for (std::size_t i = 0; i != word.size(); ++i) 
        for (std::size_t j = i + 1; j != word.size(); ++j) 
            if (word[j] < word[i]) 
                std::swap(word[i], word[j]);
            
        
    
    return word;

或递归的:

std::string alpha(std::string word)

    auto it = std::is_sorted_until(word.begin(), word.end());

    if (it == word.end()) 
        return word;
    
    std::size_t i = std::distance(word.begin(), it);
    do 
        std::swap(word[i], word[i - 1]);
        --i;
     while (i > 1 && word[i] < word[i - 1]);
    return alpha(word);

【讨论】:

以上是关于按字母顺序排列的字符串的主要内容,如果未能解决你的问题,请参考以下文章

按字母顺序排列的字符串

通过迭代按字母顺序排列字符串

使java中的字符串按字母顺序排列?

Java - 检查字符串的 ArrayList 是不是按字母顺序排列

使用 SQL 按字母顺序重新排列字符串中的字符 [关闭]

检查一个字符串的字母在另一个字符串中是不是按顺序排列