import java.util.ArrayList ;
import java.util.HashMap ;
import java.util.Scanner ;
class Source {
public ArrayList
< String
> letterCombinations
( String digits
) { ArrayList< String> result = new ArrayList<> ( ) ;
// Edge case: empty input
if ( digits == null || digits.length ( ) == 0 ) {
return result;
}
// Digit-to-letter mapping
HashMap
< Character , String
> map
= new HashMap
<> ( ) ; map.put ( '2' , "abc" ) ;
map.put ( '3' , "def" ) ;
map.put ( '4' , "ghi" ) ;
map.put ( '5' , "jkl" ) ;
map.put ( '6' , "mno" ) ;
map.put ( '7' , "pqrs" ) ;
map.put ( '8' , "tuv" ) ;
map.put ( '9' , "wxyz" ) ;
// Check for invalid digits like 0,1 or non-numeric
for ( char ch : digits.toCharArray ( ) ) {
if ( ! map.containsKey ( ch) ) {
return result; // return [] if invalid input
}
}
backtrack( result, map, digits, 0 , new StringBuilder( ) ) ;
return result;
}
private void backtrack
( ArrayList
< String
> result, HashMap
< Character , String
> map,
String digits,
int index, StringBuilder current
) { if ( index == digits.length ( ) ) {
result.add ( current.toString ( ) ) ;
return ;
}
char digit = digits.charAt ( index) ;
String possibleLetters
= map.
get ( digit
) ;
for ( char letter : possibleLetters.toCharArray ( ) ) {
current.append ( letter) ;
backtrack( result, map, digits, index + 1 , current) ;
current.deleteCharAt ( current.length ( ) - 1 ) ;
}
}
// Only for local/SPOJ testing
public static void main
( String [ ] args
) { Scanner sc
= new Scanner
( System .
in ) ; String digits
= sc.
nextLine ( ) .
trim ( ) ;
Source src = new Source( ) ;
ArrayList< String> ans = src.letterCombinations ( digits) ;
}
}
aW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKaW1wb3J0IGphdmEudXRpbC5TY2FubmVyOwoKY2xhc3MgU291cmNlIHsKCiAgICBwdWJsaWMgQXJyYXlMaXN0PFN0cmluZz4gbGV0dGVyQ29tYmluYXRpb25zKFN0cmluZyBkaWdpdHMpIHsKICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKCiAgICAgICAgLy8gRWRnZSBjYXNlOiBlbXB0eSBpbnB1dAogICAgICAgIGlmIChkaWdpdHMgPT0gbnVsbCB8fCBkaWdpdHMubGVuZ3RoKCkgPT0gMCkgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLy8gRGlnaXQtdG8tbGV0dGVyIG1hcHBpbmcKICAgICAgICBIYXNoTWFwPENoYXJhY3RlciwgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgbWFwLnB1dCgnMicsICJhYmMiKTsKICAgICAgICBtYXAucHV0KCczJywgImRlZiIpOwogICAgICAgIG1hcC5wdXQoJzQnLCAiZ2hpIik7CiAgICAgICAgbWFwLnB1dCgnNScsICJqa2wiKTsKICAgICAgICBtYXAucHV0KCc2JywgIm1ubyIpOwogICAgICAgIG1hcC5wdXQoJzcnLCAicHFycyIpOwogICAgICAgIG1hcC5wdXQoJzgnLCAidHV2Iik7CiAgICAgICAgbWFwLnB1dCgnOScsICJ3eHl6Iik7CgogICAgICAgIC8vIENoZWNrIGZvciBpbnZhbGlkIGRpZ2l0cyBsaWtlIDAsMSBvciBub24tbnVtZXJpYwogICAgICAgIGZvciAoY2hhciBjaCA6IGRpZ2l0cy50b0NoYXJBcnJheSgpKSB7CiAgICAgICAgICAgIGlmICghbWFwLmNvbnRhaW5zS2V5KGNoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsgLy8gcmV0dXJuIFtdIGlmIGludmFsaWQgaW5wdXQKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgYmFja3RyYWNrKHJlc3VsdCwgbWFwLCBkaWdpdHMsIDAsIG5ldyBTdHJpbmdCdWlsZGVyKCkpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGJhY2t0cmFjayhBcnJheUxpc3Q8U3RyaW5nPiByZXN1bHQsIEhhc2hNYXA8Q2hhcmFjdGVyLCBTdHJpbmc+IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRpZ2l0cywgaW50IGluZGV4LCBTdHJpbmdCdWlsZGVyIGN1cnJlbnQpIHsKICAgICAgICBpZiAoaW5kZXggPT0gZGlnaXRzLmxlbmd0aCgpKSB7CiAgICAgICAgICAgIHJlc3VsdC5hZGQoY3VycmVudC50b1N0cmluZygpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgY2hhciBkaWdpdCA9IGRpZ2l0cy5jaGFyQXQoaW5kZXgpOwogICAgICAgIFN0cmluZyBwb3NzaWJsZUxldHRlcnMgPSBtYXAuZ2V0KGRpZ2l0KTsKCiAgICAgICAgZm9yIChjaGFyIGxldHRlciA6IHBvc3NpYmxlTGV0dGVycy50b0NoYXJBcnJheSgpKSB7CiAgICAgICAgICAgIGN1cnJlbnQuYXBwZW5kKGxldHRlcik7CiAgICAgICAgICAgIGJhY2t0cmFjayhyZXN1bHQsIG1hcCwgZGlnaXRzLCBpbmRleCArIDEsIGN1cnJlbnQpOwogICAgICAgICAgICBjdXJyZW50LmRlbGV0ZUNoYXJBdChjdXJyZW50Lmxlbmd0aCgpIC0gMSk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIE9ubHkgZm9yIGxvY2FsL1NQT0ogdGVzdGluZwogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIFNjYW5uZXIgc2MgPSBuZXcgU2Nhbm5lcihTeXN0ZW0uaW4pOwogICAgICAgIFN0cmluZyBkaWdpdHMgPSBzYy5uZXh0TGluZSgpLnRyaW0oKTsKCiAgICAgICAgU291cmNlIHNyYyA9IG5ldyBTb3VyY2UoKTsKICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhbnMgPSBzcmMubGV0dGVyQ29tYmluYXRpb25zKGRpZ2l0cyk7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihhbnMpOwogICAgfQp9Cg==