import java.util.* ;
class Solution{
public static void main
( String [ ] args
) { Map
< String , String
> dict
= new HashMap
<> ( ) ; dict.put ( "be right back" , "BRB" ) ;
dict.put ( "be right there" , "BRT" ) ;
dict.put ( "be right later" , "BRL" ) ;
dict.put ( "be" , "B" ) ;
dict.put ( "be back soon" ,"B back soon" ) ;
dict.put ( "faster than light" ,"FTL" ) ;
dict.put ( "later" , "L8R" ) ;
"I will be right there later" ,
"I will be right there" ,
"I will be there" ,
"I will go right there" ,
"I will be there later" ,
"I am faster than you" ,
"Never faster than light" ,
"Faster than light today"
} ;
for ( String test_case
: tests
) { System .
out .
println ( test_case
+ " => " + convert
( test_case, dict
) ) ; }
}
List< String> dict_words = new ArrayList<> ( dict.keySet ( ) ) ;
if ( s1.length ( ) == s2.length ( ) ) return 0 ; // order doesn't seem to matter for same length strings
return s2.length ( ) - s1.length ( ) ; // return bigger length string first
}
} ) ;
String temp
= s.
toLowerCase ( ) ; // to perform case insensitive match for ( String dict_str
: dict_words
) { String dict_str_lower
= dict_str.
toLowerCase ( ) ; // to perform case insensitive match int index = 0 ;
do {
index = temp.indexOf ( dict_str_lower,index) ;
if ( index != - 1 ) {
replacement_index.
putIfAbsent ( index,
new String [ ] { dict.
get ( dict_str
) ,dict_str
} ) ; index++; // to get the next match index of the same word in the string.
}
} while ( index != - 1 && index < temp.length ( ) ) ;
}
StringBuilder res = new StringBuilder( "" ) ;
for ( int i = 0 ; i < s.length ( ) ; ++ i) {
if ( replacement_index.containsKey ( i) ) {
res.append ( replacement_index.get ( i) [ 0 ] ) ;
i += replacement_index.get ( i) [ 1 ] .length ( ) - 1 ;
} else {
res.append ( s.charAt ( i) ) ;
}
}
return res.toString ( ) ;
}
}
aW1wb3J0IGphdmEudXRpbC4qOwpjbGFzcyBTb2x1dGlvbnsKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGRpY3QgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgZGljdC5wdXQoImJlIHJpZ2h0IGJhY2siLCAiQlJCIik7CiAgICAgICAgZGljdC5wdXQoImJlIHJpZ2h0IHRoZXJlIiwgIkJSVCIpOwogICAgICAgIGRpY3QucHV0KCJiZSByaWdodCBsYXRlciIsICJCUkwiKTsKICAgICAgICBkaWN0LnB1dCgiYmUiLCAiQiIpOwogICAgICAgIGRpY3QucHV0KCJiZSBiYWNrIHNvb24iLCJCIGJhY2sgc29vbiIpOwogICAgICAgIGRpY3QucHV0KCJmYXN0ZXIgdGhhbiBsaWdodCIsIkZUTCIpOwogICAgICAgIGRpY3QucHV0KCJsYXRlciIsICJMOFIiKTsKICAgICAgICAKICAgICAgICBTdHJpbmdbXSB0ZXN0cyA9IHsKICAgICAgICAgICAgIkkgd2lsbCBiZSByaWdodCB0aGVyZSBsYXRlciIsCiAgICAgICAgICAgICJJIHdpbGwgYmUgcmlnaHQgdGhlcmUiLAogICAgICAgICAgICAiSSB3aWxsIGJlIHRoZXJlIiwKICAgICAgICAgICAgIkkgd2lsbCBnbyByaWdodCB0aGVyZSIsCiAgICAgICAgICAgICJJIHdpbGwgYmUgdGhlcmUgbGF0ZXIiLAogICAgICAgICAgICAiSSBhbSBmYXN0ZXIgdGhhbiB5b3UiLAogICAgICAgICAgICAiTmV2ZXIgZmFzdGVyIHRoYW4gbGlnaHQiLAogICAgICAgICAgICAiRmFzdGVyIHRoYW4gbGlnaHQgdG9kYXkiCiAgICAgICAgfTsKCiAgICAgICAgZm9yKFN0cmluZyB0ZXN0X2Nhc2UgOiB0ZXN0cyl7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0ZXN0X2Nhc2UgKyAiID0+ICIgKyBjb252ZXJ0KHRlc3RfY2FzZSwgZGljdCkpOyAgIAogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0KFN0cmluZyBzLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGRpY3QpIHsKICAgICAgICAKICAgICAgICBMaXN0PFN0cmluZz4gZGljdF93b3JkcyA9IG5ldyBBcnJheUxpc3Q8PihkaWN0LmtleVNldCgpKTsKICAgICAgICBNYXA8SW50ZWdlcixTdHJpbmdbXT4gcmVwbGFjZW1lbnRfaW5kZXggPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgCiAgICAgICAgQ29sbGVjdGlvbnMuc29ydChkaWN0X3dvcmRzLG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKXsKICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKFN0cmluZyBzMSxTdHJpbmcgczIpewogICAgICAgICAgICAgICAgaWYoczEubGVuZ3RoKCkgPT0gczIubGVuZ3RoKCkpIHJldHVybiAwOyAvLyBvcmRlciBkb2Vzbid0IHNlZW0gdG8gbWF0dGVyIGZvciBzYW1lIGxlbmd0aCBzdHJpbmdzCiAgICAgICAgICAgICAgICByZXR1cm4gczIubGVuZ3RoKCkgLSBzMS5sZW5ndGgoKTsgLy8gcmV0dXJuIGJpZ2dlciBsZW5ndGggc3RyaW5nIGZpcnN0CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIAogICAgICAgIFN0cmluZyB0ZW1wID0gcy50b0xvd2VyQ2FzZSgpOyAvLyB0byBwZXJmb3JtIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2gKICAgICAgICBmb3IoU3RyaW5nIGRpY3Rfc3RyIDogZGljdF93b3Jkcyl7CiAgICAgICAgICAgIFN0cmluZyBkaWN0X3N0cl9sb3dlciA9IGRpY3Rfc3RyLnRvTG93ZXJDYXNlKCk7IC8vIHRvIHBlcmZvcm0gY2FzZSBpbnNlbnNpdGl2ZSBtYXRjaAogICAgICAgICAgICBpbnQgaW5kZXggPSAwOwogICAgICAgICAgICBkb3sKICAgICAgICAgICAgICAgIGluZGV4ID0gdGVtcC5pbmRleE9mKGRpY3Rfc3RyX2xvd2VyLGluZGV4KTsKICAgICAgICAgICAgICAgIGlmKGluZGV4ICE9IC0xKXsKICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudF9pbmRleC5wdXRJZkFic2VudChpbmRleCxuZXcgU3RyaW5nW117ZGljdC5nZXQoZGljdF9zdHIpLGRpY3Rfc3RyfSk7CiAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsvLyB0byBnZXQgdGhlIG5leHQgbWF0Y2ggaW5kZXggb2YgdGhlIHNhbWUgd29yZCBpbiB0aGUgc3RyaW5nLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9d2hpbGUoaW5kZXggIT0gLTEgJiYgaW5kZXggPCB0ZW1wLmxlbmd0aCgpKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgU3RyaW5nQnVpbGRlciByZXMgPSBuZXcgU3RyaW5nQnVpbGRlcigiIik7CiAgICAgICAgCiAgICAgICAgZm9yKGludCBpID0gMDtpIDwgcy5sZW5ndGgoKTsgKytpKXsKICAgICAgICAgICAgaWYocmVwbGFjZW1lbnRfaW5kZXguY29udGFpbnNLZXkoaSkpewogICAgICAgICAgICAgICAgcmVzLmFwcGVuZChyZXBsYWNlbWVudF9pbmRleC5nZXQoaSlbMF0pOwogICAgICAgICAgICAgICAgaSArPSByZXBsYWNlbWVudF9pbmRleC5nZXQoaSlbMV0ubGVuZ3RoKCkgLSAxOwogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQocy5jaGFyQXQoaSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzLnRvU3RyaW5nKCk7CiAgICB9Cgp9