牛客网 Rabbit的字符串
題目描述
Rabbit得到了一個字符串,她的好朋友xxx可以給這個字符串施加一次魔法。
 魔法可以選擇字符串的任一位置,并將該位置后面的所有字符水平拼接到串首。
 例如:對于字符串abcde,可以通過施加魔法得到cdeab。
 如果xxx通過施加魔法將字符串的字典序變得嚴格比之前的小,那么他將拿走這一字符串。
 Rabbit想知道自己的字符串會不會被xxx拿走。
輸入描述:
 第一行一個整數n,表示字符串的長度。
 接下來一行一個長度為n的只由小寫字母組成的字符串。
 輸出描述:
 如果Rabbit的字符串會被xxx拿走,輸出“YES”。
 否則輸出“NO”。
 (不輸出引號)
 示例1
 輸入
5
 cdeab
輸出
YES
說明
xxx可以把e之后的部分“ab”放到串首,得到abcde,字典序比cdeab小,故將拿走字符串。
示例2
 輸入
5
 abcde
輸出
NO
注:
 1≤n≤100000
思路
將字符串拆成兩部分后拼接成新的字符串再和原來字符串比較字典序即可。一點優化:先找到字符串中字典序最小的字母,然后僅用以這個字母作為開頭拼接方式和原字符串比較即可。
java代碼
import java.util.*; public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);int n = sc.nextInt();String S=sc.next();char min=get_min(S,'z');for(int i=0;i<n;i++){if(S.charAt(i)<=min){String pre=S.substring(i);String post=S.substring(0,i);String SS=pre+post;if(SS.compareTo(S)<0){System.out.println("YES");return;} }}System.out.println("NO");}//找字符串中字典序最小的字母public static char get_min(String S,char m){int n=S.length();m=S.charAt(0);for(int i=0;i<n;i++){if(S.charAt(i)<=m) m=S.charAt(i);if(m=='a') return m;}return m;}}神奇腦回路
一開始看到這個題就想用字典樹做,結果做了很多優化還是有兩組數據沒過(執行錯誤)。不知道可不可以優化了。先po個代碼吧。有時間再看看問題出在哪。
java代碼
import java.util.*; import java.lang.Object;public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);int n = sc.nextInt();String S=sc.next();Trie trie=new Trie();trie.root.equal=true;char min=get_min(S,'z');trie.Insert(S,S);Set<String> set=new HashSet<String>();for(int i=0;i<n;i++){if(S.charAt(i)<=min){ String pre=S.substring(i);String post=S.substring(0,i);String SS=pre+post;if(set.contains(SS)) continue;else set.add(SS);if(trie.Insert(SS,S)){System.out.println("YES");return;}}}System.out.println("NO");}public static char get_min(String S,char m){int n=S.length();m=S.charAt(0);for(int i=0;i<n;i++){if(S.charAt(i)<=m) m=S.charAt(i);if(m=='a') return m;}return m;}}class TrieNode{public boolean equal;public TrieNode []next=null;public TrieNode(){equal=false;next=new TrieNode[26];} }class Trie{public TrieNode root;public Trie(){root=new TrieNode();}public boolean Insert(String SS , String S){int len=SS.length();TrieNode p=root;for(int i=0;i<len;i++){int Ch=SS.charAt(i)-'a';int ch=S.charAt(i)-'a';if(p.equal&&Ch>ch) return false;if(p.equal&&Ch<ch) return true;if(p.next[Ch]==null){p.next[Ch]=new TrieNode();if(SS.charAt(i)==S.charAt(i))p.next[Ch].equal=true;}p=p.next[Ch];}return false;} }報錯內容:
執行出錯
 請檢查是否存在數組越界等非法訪問情況
 Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
 at java.util.Arrays.copyOf(Arrays.java:3332)
 at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
 at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
 at java.lang.StringBuilder.append(StringBuilder.java:136)
 at Main.main(Main.java:18)
總結
以上是生活随笔為你收集整理的牛客网 Rabbit的字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 基于vlc的ActiveX流媒体播放器的
- 下一篇: 《定位》书摘
