Problem Statement
Some dictionaries use a word pattern that consists of letters, '?' symbols which each denote exactly one letter, and '*' symbols which each denote zero or more letters.
Interestingly, some patterns represent the same set of words. For example, "*??*a" and "?*?a" (quotes for clarity only) patterns both represent all words that consist of three or more letters and end with 'a'.
You will be given a
Definition
- Class:
- PatternOptimizer
- Method:
- optimize
- Parameters:
- String
- Returns:
- String
- Method signature:
- String optimize(String pattern)
- (be sure your method is public)
Notes
- Note that '*' comes before '?' in the lexicographical order.
Constraints
- pattern will contain between 1 and 50 characters, inclusive.
- pattern will contain only letters ('a'-'z', 'A'-'Z'), '?' and '*'.
Examples
"*??*a"
Returns: "*??a"
"*b**a*"
Returns: "*b*a*"
"cla??"
Returns: "cla??"
"*?*?*?*"
Returns: "*???"
"T***nd?*"
Returns: "T*nd*?"
"????*???*caa??aaa*a*babc**?*b*?"
Returns: "*???????caa??aaa*a*babc*?b*?"
"a"
Returns: "a"
"?*c"
Returns: "*?c"
"aa*a?*aa*a*a?b?*a*?*caaa"
Returns: "aa*a*?aa*a*a?b*?a*?caaa"
"*ac??a**b***c"
Returns: "*ac??a*b*c"
"a*?c**a*bc?a?a*c?a?ab"
Returns: "a*?c*a*bc?a?a*c?a?ab"
"?c?*aac*a????aa??*?*a**?b*ca*a*ca***c?**a?cca"
Returns: "?c*?aac*a????aa*???a*?b*ca*a*ca*c*?a?cca"
"?"
Returns: "?"
"*"
Returns: "*"
"*baa?*a?b????a*a?*?"
Returns: "*baa*?a?b????a*a*??"
"*b?a?*?*???**c*c??*a?a?*??**aa?*?a*c??a??a"
Returns: "*b?a*?????c*c*??a?a*???aa*??a*c??a??a"
"?ba**?b??a?c??aa*a*"
Returns: "?ba*?b??a?c??aa*a*"
"a*?****?a*??a?a????a**?aa*?*a**??aa***??"
Returns: "a*??a*??a?a????a*?aa*?a*??aa*??"
"a*?*???b?*??a?a*?*?c?aa*???*?a?*?aa"
Returns: "a*????b*???a?a*??c?aa*????a*??aa"
"a*?aaaa*aa?a*a*c**?*a??*?*a?*???b**a*a*?***?*?*a?"
Returns: "a*?aaaa*aa?a*a*c*?a*???a*????b*a*a*???a?"
"**a**??*a**???**??*"
Returns: "*a*??a*?????"
"*???a***a?a"
Returns: "*???a*a?a"
"c?*?a**?b?*a*?*a??*aaa**??a**a?a"
Returns: "c*??a*?b*?a*?a*??aaa*??a*a?a"
"ac?c*?*a*??**a?*?*???a"
Returns: "ac?c*?a*??a*?????a"
"a?**?b***?*?**b****?b?*****a??**??**"
Returns: "a*??b*??b*?b*?a*????"
"a**a*?*****?*?*??*??**?***?a*?***a***?**?a*????*?"
Returns: "a*a*?????????a*?a*??a*?????"
"???**??**?"
Returns: "*??????"
"**?a***?**???**?**?*******?a"
Returns: "*?a*???????a"
"??**?*a?*??***??a??*???"
Returns: "*???a*?????a*?????"
"*??*???*???**?*?*?*?**?*****?aaa?***a**?*?*??"
Returns: "*??????????????aaa*?a*????"
"*?*a*a?a?**????a**??*??*???aa??*?**"
Returns: "*?a*a?a*?????a*???????aa*???"
"a?a???*?????**aa?*a?*??**a???"
Returns: "a?a*????????aa*?a*???a???"
"a*??*a?*?*"
Returns: "a*??a*??"
"*?a?*****?*a??*?*??*?"
Returns: "*?a*??a*??????"
"***a?**a????aa**?????a*?****?a???*a**????****?****"
Returns: "*a*?a????aa*?????a*??a*???a*?????"
"*b*x*k?q*?*dkkbuuj?sjoa*aa*oro*?o*c?d*?waaw?t?y?ie"
Returns: "*b*x*k?q*?dkkbuuj?sjoa*aa*oro*?o*c?d*?waaw?t?y?ie"
"*aekldaun**eyz**???ighg?*oipmna*b?yeue**tas*e?iksd"
Returns: "*aekldaun*eyz*???ighg*?oipmna*b?yeue*tas*e?iksd"
"ycujo**fe*s*apfza?jaa*yca?oy*?yeqp?nwuuqocbssq*ges"
Returns: "ycujo*fe*s*apfza?jaa*yca?oy*?yeqp?nwuuqocbssq*ges"
"?eyagg*wkade*a?hccbcambeaa?wc*?dyye?*k?icnc**?qhia"
Returns: "?eyagg*wkade*a?hccbcambeaa?wc*?dyye*?k?icnc*?qhia"
"khv?a*q*squwaqzdq?dgu*ohqa*li?es?kqstyqedatk??akwa"
Returns: "khv?a*q*squwaqzdq?dgu*ohqa*li?es?kqstyqedatk??akwa"
"efv?tqq**w*oasessac?hhli?yp?dasstioy*c*xr??tacsca?"
Returns: "efv?tqq*w*oasessac?hhli?yp?dasstioy*c*xr??tacsca?"
"x*kyfo??uuzriw*va*?*gzq?axy**??*ucnwuen?y*lw*ii?cy"
Returns: "x*kyfo??uuzriw*va*?gzq?axy*??ucnwuen?y*lw*ii?cy"
"a*t??z?mi?*zr*szijfe?u?igbmaynb*ko?a*zue?wnkw?pq*?"
Returns: "a*t??z?mi*?zr*szijfe?u?igbmaynb*ko?a*zue?wnkw?pq*?"
"fk*iquk??*ofkhp*?uv?csacgfw?ax?b?ayzuqtym*faw*?sti"
Returns: "fk*iquk*??ofkhp*?uv?csacgfw?ax?b?ayzuqtym*faw*?sti"
"gmn***ufcam*pm?*?a?cs?om*ix?iuizauv??amg?jas*?i*wy"
Returns: "gmn*ufcam*pm*??a?cs?om*ix?iuizauv??amg?jas*?i*wy"
"icwyj?*??kvci?eqj?i?wzs??ag*q**?*aipj*?a*e*v*m*oga"
Returns: "icwyj*???kvci?eqj?i?wzs??ag*q*?aipj*?a*e*v*m*oga"
"*??wowch*budeun?x?aa*e*ceu?sq?qztucaiegcq*myrwjrqm"
Returns: "*??wowch*budeun?x?aa*e*ceu?sq?qztucaiegcq*myrwjrqm"
"suysq*kuuhyumei??c*yytqma?w*gck***?*u?*xeys**a?*z*"
Returns: "suysq*kuuhyumei??c*yytqma?w*gck*?u*?xeys*a*?z*"
"??cesxq?*b?*ily*?*xlk**?oenirgsat*??xqcktw*?gqmxec"
Returns: "??cesxq*?b*?ily*?xlk*?oenirgsat*??xqcktw*?gqmxec"
"*axa?xmmy?zcatwmyzv?tam???akc??eel*cws?lyy?*onar?n"
Returns: "*axa?xmmy?zcatwmyzv?tam???akc??eel*cws?lyy*?onar?n"
"c?uckxe*aqmb*?**geykc*ouwiccwo?smu?uama*?scytjuqtj"
Returns: "c?uckxe*aqmb*?geykc*ouwiccwo?smu?uama*?scytjuqtj"
"??ofe**yf*?uo*qg?aqagze?oswud*ra*kmic?mmpgwomo*wla"
Returns: "??ofe*yf*?uo*qg?aqagze?oswud*ra*kmic?mmpgwomo*wla"
"wk*vh?eu?*?mana?yqpauaa*y*rpt?ax?suz?*a?x?twnuwie?"
Returns: "wk*vh?eu*??mana?yqpauaa*y*rpt?ax?suz*?a?x?twnuwie?"
"ucjayghnq??gyy?uvii?lpa*y?*eua*n??*cnynmdiioqy*bik"
Returns: "ucjayghnq??gyy?uvii?lpa*y*?eua*n*??cnynmdiioqy*bik"
"gpc*k**?k?aeue*cc*a*psoaojst*s?wi?l?k?cwi?**ms?a*z"
Returns: "gpc*k*?k?aeue*cc*a*psoaojst*s?wi?l?k?cwi*?ms?a*z"
"???xx?*xx?x?*xxx???**?x??*?*?*?xx***??**??**??x??*"
Returns: "???xx*?xx?x*?xxx*????x*?????xx*??????x*??"
"****?x?***??xx*x?**?*??xx?x?x??z*z*??*x?*x?*?**z?*"
Returns: "*?x*???xx*x*????xx?x?x??z*z*??x*?x*??z*?"
"x?????z?xx?x**xx?*xyy*?*????xx*???**x???????*?y**?"
Returns: "x?????z?xx?x*xx*?xyy*?????xx*???x*????????y*?"
"***xy?x*?yxx**?x****?x*?*?x***x?*??x**?xz??*??*?*x"
Returns: "*xy?x*?yxx*?x*?x*??x*x*???x*?xz*?????x"
"x?*?x*?x?**??xxy*?x?x?x?????x*?xxx??xz?*y*?*?*x*?*"
Returns: "x*??x*?x*???xxy*?x?x?x?????x*?xxx??xz*?y*??x*?"
"???**???***?*?***??*??*?***???**???***????????*??*"
Returns: "*?????????????????????????????"
"?*?**??***??***???**???*?*??*?**??*????*?*???*????"
Returns: "*??????????????????????????????"
"????????*?*?*??*?****?***?***???**??***??**?*?????"
Returns: "*????????????????????????????"
"??**???*?****?*????***?*????**??***????????****?**"
Returns: "*???????????????????????????"
"??*?????***???**?????***???***??*??**??***?***????"
Returns: "*?????????????????????????????"
"***??*????*????**??*???*?????*?*??*?****?**?*?????"
Returns: "*???????????????????????????????"
"*?****?**??*??*?*?*???*?**??**?**??*?*?*****???**?"
Returns: "*???????????????????????"
"????*?**???*?*?*??????**???****?????*????****?*?*?"
Returns: "*???????????????????????????????"
"*????*???*?*???**???**?*?***???*?*????*??*??******"
Returns: "*????????????????????????????"
"?*?*?*???***?*??**?***??????????*??*?????*?*?***?*"
Returns: "*??????????????????????????????"
"?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*"
Returns: "*?????????????????????????"
"*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?"
Returns: "*?????????????????????????"
"?*?*?*?*?*?*?*?*?*?*?*?*z*?*?*?*?*?*?*?*?*?*?*?*?*"
Returns: "*????????????z*????????????"
"*?*?*?*?*?*?*?*?*?*?*?*?z?*?*?*?*?*?*?*?*?*?*?*?*?"
Returns: "*????????????z*?????????????"
"**************************************************"
Returns: "*"
"??????????????????????????????????????????????????"
Returns: "??????????????????????????????????????????????????"
"?*************************************************"
Returns: "*?"
"?????????????????????????????????????????????????*"
Returns: "*?????????????????????????????????????????????????"
"T*??*?"
Returns: "T*???"
"T***nd?*"
Returns: "T*nd*?"
"cla?*"
Returns: "cla*?"
"??*"
Returns: "*??"
"**"
Returns: "*"
"?*"
Returns: "*?"
"??****?ab?**?c**??ad*"
Returns: "*???ab*??c*??ad*"
"????****"
Returns: "*????"
"A?*"
Returns: "A*?"
"x"
Returns: "x"
"T***nd?*nd?*"
Returns: "T*nd*?nd*?"
"*?"
Returns: "*?"
"**asg*??*?*?*?*?g**h????*?*?*p*?"
Returns: "*asg*??????g*h*??????p*?"