Ugly Number -最小表示法
阿新 • • 發佈:2018-12-12
- 初始時,讓i=0,j=1,k=0,其中i,j,k表示的是以i開頭和以j開頭的字串的前k個字元相同
- 分為三種情況
- 1.如果str[i+k]==str[j+k] k++。
- 2.如果str[i+k] > str[j+k] i = i + k + 1,即最小表示不可能以str[i->i+k]開頭。
- 3.如果str[i+k] < str[j+k] j = j + k + 1,即最小表示不可能以str[j->j+k]開頭。
- 那麼只要迴圈n次,就能夠判斷出字串的最小表示是以哪個字元開頭。
- 為什麼當str[i+k] > str[j+k] i = i + k + 1,最小表示不可能以str[i->i+k]開頭
- 因為以i或j——>i或j+k之間的為新的起點肯定不如以當前的minn+k開始的小
-
#include<bits/stdc++.h> using namespace std; int n,ans; string str,son; int getmin() { int i=0,j=1,k=0; while(i<n&&j<n&&k<n) { int t=str[(i+k)%n]-str[(j+k)%n]; if(t==0) k++; else { if(t>0) i+=k+1; else j+=k+1; if(i==j) j++; k=0; } } return min(i,j); } int main() { cin>>n>>str; int ans=getmin(); for(int i=ans; i<ans+n; i++) son+=str[i%n]; for(int i=0; i<n; i++) if(son[i]<str[i]) { cout<<"No"<<endl; return 0; } cout<<"Yes"<<endl; return 0; }