牛客网 Rabbit的字符串
題目描述
Rabbit得到了一個(gè)字符串,她的好朋友xxx可以給這個(gè)字符串施加一次魔法。
魔法可以選擇字符串的任一位置,并將該位置后面的所有字符水平拼接到串首。
例如:對(duì)于字符串a(chǎn)bcde,可以通過施加魔法得到cdeab。
如果xxx通過施加魔法將字符串的字典序變得嚴(yán)格比之前的小,那么他將拿走這一字符串。
Rabbit想知道自己的字符串會(huì)不會(huì)被xxx拿走。
輸入描述:
第一行一個(gè)整數(shù)n,表示字符串的長(zhǎng)度。
接下來一行一個(gè)長(zhǎng)度為n的只由小寫字母組成的字符串。
輸出描述:
如果Rabbit的字符串會(huì)被xxx拿走,輸出“YES”。
否則輸出“NO”。
(不輸出引號(hào))
示例1
輸入
5
cdeab
輸出
YES
說明
xxx可以把e之后的部分“ab”放到串首,得到abcde,字典序比cdeab小,故將拿走字符串。
示例2
輸入
5
abcde
輸出
NO
注:
1≤n≤100000
思路
將字符串拆成兩部分后拼接成新的字符串再和原來字符串比較字典序即可。一點(diǎn)優(yōu)化:先找到字符串中字典序最小的字母,然后僅用以這個(gè)字母作為開頭拼接方式和原字符串比較即可。
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;}}神奇腦回路
一開始看到這個(gè)題就想用字典樹做,結(jié)果做了很多優(yōu)化還是有兩組數(shù)據(jù)沒過(執(zhí)行錯(cuò)誤)。不知道可不可以優(yōu)化了。先po個(gè)代碼吧。有時(shí)間再看看問題出在哪。
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;} }報(bào)錯(cuò)內(nèi)容:
執(zhí)行出錯(cuò)
請(qǐng)檢查是否存在數(shù)組越界等非法訪問情況
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)
總結(jié)
以上是生活随笔為你收集整理的牛客网 Rabbit的字符串的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于vlc的ActiveX流媒体播放器的
- 下一篇: 《定位》书摘