Problem Statement
A popular on-line music service allows customers to play their music on up to three different computers, each of which must have a license. A license can be transferred from one computer to another, but it cannot be transferred back. In other words, once a computer has lost its license, it can never acquire a new one.
You are auditing customer access records, trying to detect fraud. You have a log of the computers a particular customer has used to play music, and you want to know whether she has done so legally. Each different computer is identified by a single uppercase
letter ('A'-'Z'). The
You want to detect when a customer's log could not have happened legally, no matter how she managed her licenses. For example, there is no legal way to produce the log "ABCDABCD": The customer can only play the first song on computer 'D' by transferring a license from one of the other computers, so one of the three subsequent songs will be played on a computer that has lost its license. When you have detected fraud, you are to return the zero-based index of the first song that proves that fraud occurred. In this case, you would return 6, the index of the second 'C', because the prefix "ABCDAB" could have been produced legally but "ABCDABC" could not. (Note that this does not necessarily mean that the 'C' access itself is illegal because the illegal access might have occurred earlier.)
If the log does not prove fraud, return -1.
Definition
- Class:
- MusicLicenses
- Method:
- audit
- Parameters:
- String
- Returns:
- int
- Method signature:
- int audit(String log)
- (be sure your method is public)
Constraints
- log contains between 1 and 50 characters, inclusive.
- Each character in log is an uppercase letter ('A'-'Z').
Examples
"ABCBAD"
Returns: -1
The first example above. No fraud has been detected.
"ABCDABCD"
Returns: 6
The second example above. The prefix "ABCDAB" could have been produced legally but "ABCDABC" could not.
"X"
Returns: -1
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Returns: -1
"AVERYUNUSUALACCESSPATTERNINDEED"
Returns: 15
"Q"
Returns: -1
"AZ"
Returns: -1
"JKL"
Returns: -1
"JKLJKLJKLJKLJKLJKLJKLJKLJKLJKLJKLJKL"
Returns: -1
"FOURSCOREANDSEVENYEARS"
Returns: 12
"TWASBRILLIGANDTHESLYTHYTOVES"
Returns: 14
"ALLMIMSYWERETHEBOROGOVES"
Returns: 23
"AAAAAAAAAABBBBBBBBBBAAAAAAAAAACCCCCCCCCCAAAADCCBBA"
Returns: 49
"TISAGIFTTOBESIMPLE"
Returns: 12
"MYFAVORITEPIZZATOPPINGISSAUSAGE"
Returns: 15
"HAWHAURYEGAUNYECROWLINFERLIE"
Returns: 13
"LOOKUPONMYWORKSYEMIGHTYANDDESPAIR"
Returns: 15
"NOWISTHEWINTEROFOURDISCONTENT"
Returns: 10
"THEQUICKBROWNFOXJUMPEDOVERALAZYDOG"
Returns: 20
"ICHINISANSHIGOROKU"
Returns: 10
"SYZYGYQUICKTROPICALHEXAXE"
Returns: -1
"DIJKSTRAKNUTHCOOK"
Returns: -1
"ABCDEFGHIJIHGFEDCBA"
Returns: 12
"PEONZSGPBRXCYHYUTSQJKHWFDSMFXQI"
Returns: 28
"GPRJWGQUMDONPVGLPEZWTQPKGIVZMYABEJXCSO"
Returns: 19
"BEBHPYRFHPHAPMRZQQCHOSHYBGWCKKTDF"
Returns: 14
"BGMFPYV"
Returns: -1
"SPHAIQGJGMTEGIYOSHFWCIHIMFNQGEGIGDBMCT"
Returns: 16
"OJUGBQZWQGOQPAMJRMEHGJOC"
Returns: 10
"VCAGZEQEZMKCAOYUCGJWTUFANXFSNVIMRGLWPAPBJJQXQRZF"
Returns: 11
"BNLQTYUOGEWHVIVVJCP"
Returns: -1
"IHLXLBQKKJSJALICOGOHLIRXRATJAQI"
Returns: 14
"RDKRMAGPG"
Returns: -1
"FLROYBJZISBUGTJSLZNUJFCAFTWE"
Returns: 16
"MJOPGFRNYDDIYGHUO"
Returns: 16
"MVXFHLBGHHPEXCOVFSA"
Returns: 15
"AWWQQLJRBWPKNFT"
Returns: -1
"GLOUFAKMWKGLUKNHCENPQZHCDHZIHBGFMNIF"
Returns: 11
"YWRIMKCLYLGYTKECVQSVELCZUWDBDQKBAABAUJMMGYBPMIWWFK"
Returns: 15
"OEJPWNPVSKLGKHMVPKACJTRQTLXECVWUEFYBZQUPY"
Returns: 16
"YMZVEXTVTGETFTDXYZKIDIULJXO"
Returns: 15
"LLPECGQWRXTYFZYQTOJVGBEFRDVUWOUOHXZFBPZYHBMZ"
Returns: 16
"KJVFPLVSYFSMLRHOHNUYPXLQNLOULBQZIDZFMZFYHPFUIRR"
Returns: 12
"RXCUXDZEDSXKTXTHDKGNPNMDBKTREEXEXOCKGSIRTCN"
Returns: 17
"XAQYAKAPLSFCWEECHRCTMDNYBJEZGJQETTVWGQIKRU"
Returns: 26
"NOHRUPPACXKPCSHLVAKJWVIDPEOYMHEIBYWGQUCRLFOY"
Returns: 14
"IXMFBXYHDHDTKMCHYZCYVTHKG"
Returns: 16
"FNOZZO"
Returns: -1
"RCRIRTJTGDSUUVMMCKXMWHAADFVBPOZSIQJYZAMBJHHF"
Returns: 26
"WVHJQXPBCETBYBWBWUVTEPSSBRIDIYW"
Returns: 18
"XXEXNHDSFDL"
Returns: -1
"JUCHLVJQYZLL"
Returns: -1
"SAOBTOFGMBPMIIUPGZDQXVMLOAOPX"
Returns: 22
"IFTKLHRMLEWRKFYJCEITLVIYTHLWVJBGMSDVZKDAAQGMNEFESY"
Returns: 12
"AQBUXTMWVXRUXJFSXOIJCUIUGLAMWDPFMDFU"
Returns: 21
"BQQNNQOBDKWDFCMXTYSJUWJSAQQAPGBUZNHAGIPLYN"
Returns: 23
"CJRHGKOEVLNUZXVZEYELBEAZIUOGKNPEMFVJ"
Returns: 16
"FBEGTJBUTVUGXRWBKL"
Returns: 11
"DJMALOMYZUSEPG"
Returns: -1
"DMVYJCLLTUBQAENV"
Returns: -1
"XNDLIBAOVVZRSVFSWAQLCTILS"
Returns: 19
"WAMDAOIFDQKSSCO"
Returns: -1
"JZTOCY"
Returns: -1
"GTSBHZSCAJUWACISSVEYBRDYOJQA"
Returns: 15
"LXLMVGYINCGDRCMNGREAKULBFEFZJZWNZBRJJSIBIXSTPR"
Returns: 15
"KLWQDOAZNYTFDJXZ"
Returns: -1
"TEOOTXKQAINOSY"
Returns: -1
"JBMXKSZIDOQQHSKPSPBJKMHCUQDHBIKOWSSKJK"
Returns: 18
"HKSOZWDHXIFPMWTTNZVSJFWSGXLLPHHTLXDOSYKPGUYLKOKGFB"
Returns: 17
"EHJJYDTKGBZZFJQRM"
Returns: -1
"AJKLOLZEJRUPXKHHG"
Returns: 13
"NEIVMXBGNGQWAXNWLNMULIILOPHWCMOCOVO"
Returns: 15
"JXUOWGZRMQKHNPKBZUIDXCRWXCYNJOFXBZLNKXI"
Returns: 17
"ABCDABC"
Returns: 6
"ABCDABD"
Returns: -1