1. 程式人生 > 實用技巧 >【C/C++】3-6 環狀序列/陣列和字串/演算法競賽入門經典

【C/C++】3-6 環狀序列/陣列和字串/演算法競賽入門經典

【字典序比較】
對於兩個字串,比較字典序,從第一個開始,如果有兩位不一樣的出現,那麼哪個的ASCII碼小,就是字典序較小。如果都一樣,那麼短的小。
【題目】
輸入一個環狀串,輸出最小的字典序序列。
【程式碼】

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int maxn = 105;
char input[maxn];

//環狀串s的表示法p是否比表示法q的字典序小
int less(const char* s, int p, int q)
//比較p的字典序如果比q的字典序小,就輸出1;否則輸出0
//注意字典序要比較所有字母
{
   int n = strlen(s);
   for (int i = 0; i < n; i++)
   {
      if (s[(p+i)%n]!=s[(q+i)%n])
      {
         return (s[(p+i)%n]<s[(q+i)%n]);
      }
   }
   return 0;
}

int main()
{
   int T;
   scanf("%d",&T);
   for(int i = 0; i < T; i++) //T組資料
   { 
      scanf("%s",input); 
      int ans = 0;
      int n = strlen(input);
      for (int j = 0; j < n; j++) //每一個順序打頭比較,找出最小的那個打頭位置
      {
         if(less(input,j,ans)) ans = j;
      }
      for (int j = 0; j < n; j++){
         printf("%c",input[(ans+j)%n]);
         //putchar(input[j+ans]%n);
      }
      putchar('\n');
   }   
   system("pause");
   return 0;
}