рд╕рдмрд╕реЗ рдЫреЛрдЯреА рд╕рд╛рдорд╛рдиреНрдп рд╕реБрдкрд░рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛

рд╕рдмрд╕реЗ рдЫреЛрдЯреА рд╕рд╛рдорд╛рдиреНрдп рдЕрдзрд┐рд░рдЪрдирд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рддреИрдпрд╛рд░ рдХреА рдЧрдИ рд╣реИ: рд╕рдмрд╕реЗ рдЫреЛрдЯреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЗрд╕ рддрд░рд╣ рдЦреЛрдЬреЗрдВ рдХрд┐ рджрд┐рдП рдЧрдП рд╕реЗрдЯ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдЗрд╕рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧреАред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЬреИрд╡ рд╕реВрдЪрдирд╛ рд╡рд┐рдЬреНрдЮрд╛рди (рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдЬреАрдиреЛрдо рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рдХрд╛рд░реНрдп) рдФрд░ рдбреЗрдЯрд╛ рдХрдореНрдкреНрд░реЗрд╢рди (рдбреЗрдЯрд╛ рдХреЗ рдмрдЬрд╛рдп, рдЬреЛрдбрд╝реЗ рдХреЗ рдЕрдкрдиреЗ рд╕реБрдкрд░рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдФрд░ рд╕реАрдХреНрд╡реЗрдВрд╕, рдкреНрд░рдХрд╛рд░ (рдШрдЯрдирд╛ рд╕реВрдЪрдХрд╛рдВрдХ, рд▓рдВрдмрд╛рдИ)) рджреЛрдиреЛрдВ рдореЗрдВ рд╣реЛрддреА рд╣реИред

рдЬрдм рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдФрд░ рд░реВрд╕реА рдореЗрдВ рдЗрд╕рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЦреЛрдЬ рдХреА, рддреЛ рдЬреИрд╡ рд╕реВрдЪрдирд╛ рд╡рд┐рдЬреНрдЮрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рдкреЛрд╕реНрдЯ рдереЗ, рдЬрд╣рд╛рдВ рдЗрди рд╢рдмреНрджреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдмреЗрд╢рдХ, рдХреЛрдИ рдХреЛрдб рдирд╣реАрдВ рдерд╛ (рд▓рд╛рд▓рдЪреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЫреЛрдбрд╝рдХрд░)ред рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рддрдереНрдп рдпрд╣рд╛рдВ рдПрдХ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдЙрдиреНрдирдд рд╣реЛ рдЧрдпрд╛ рд╣реИред

рд╕рд╛рд╡рдзрд╛рдиреА, 4 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ!

рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рд▓реЗрдЦ рдПрдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕реАрдЬрд╝рди, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЬрд╛рд╡рд╛ рдореЗрдВ рдбреИрди рдЧреИрд╕рдлрд╝реАрд▓реНрдб рдХреА рдкреБрд╕реНрддрдХ (рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рд╛рд╣рд┐рддреНрдп рджреЗрдЦреЗрдВ) рд╕реЗ рд╕реБрдкрд░рд▓рд╛рдЗрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ 4-рдЕрдиреБрдорд╛рдирд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдкрд░рд┐рдЪрдп рдФрд░ рдПрдХ 2-рдЕрдиреБрдорд╛рдирд┐рдд, рд▓рд╛рд▓рдЪреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдоред

рд╕рд░рд▓рддрдо рд╕реНрдерд┐рддрд┐ рдореЗрдВ (рдпрджрд┐ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдирд╛рдо "рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛" рд╢рдмреНрдж рдирд╣реАрдВ рдерд╛), рддреЛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдореЗрдВ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЗрд╕ рдмрдпрд╛рди рдореЗрдВ, рд╣рдо рдПрдирдкреА-рдкреВрд░реНрдгрддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдИ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЯреНрдпреВрд░рд┐рдВрдЧ рдорд╢реАрди рдкрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдбреЗрдЯрд╛ рдЖрдХрд╛рд░ рдореЗрдВ рдмрд╣реБрдкрдж рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВред

рдЗрдирдкреБрдЯ: рдПрд╕ 1 , рдПрд╕ 2 , ..., рдПрд╕ рдПрди - рдкрд░рд┐рдорд┐рдд рд╡рд░реНрдгрдорд╛рд▓рд╛ рдИ * рдХреА рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╕реЗрдЯред
рдирд┐рд╖реНрдХрд░реНрд╖: X рд╡рд░реНрдгрдорд╛рд▓рд╛ E * рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ S 1. рд╣реИред рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдЬрд╣рд╛рдБ рд▓рдВрдмрд╛рдИ X рд╣реИред рдХрдо рд╕реЗ рдХрдоред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╕реЗрдЯ S = {abc, cde, eab} рд▓реЗрдВред рд╕рдВрдШрдирди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдЙрдЯрдкреБрдЯ рд╕реБрдкрд░рд▓рд╛рдЗрди рдХреА рд▓рдВрдмрд╛рдИ 9 (X = abccdeeab) рд╣реЛрдЧреА, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдкреНрд░рддреНрдпрдп-рдЙрдкрд╕рд░реНрдЧ рдореИрдЪ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдореИрдЪ рдХреА рд▓рдВрдмрд╛рдИ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред (рдЕрдВрдЧреНрд░реЗрдЬреА рд╢рдмреНрдж рдХрд╛ рдЪреБрдирд╛рд╡ рдЖрдХрд╕реНрдорд┐рдХ рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рд░реВрд╕реА рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдФрд░ рдЕрд╕реНрдкрд╖реНрдЯ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рд╣реИред рд░реВрд╕реА рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рд╣рд┐рддреНрдп рдореЗрдВ, рд╢рдмреНрдж рдУрд╡рд░рд▓реИрдк, рдЪреМрд░рд╛рд╣реЗ, рдУрд╡рд░рд▓реИрдк рдФрд░ рдкреНрд░рддреНрдпрдп-рдЙрдкрд╕рд░реНрдЧ рдореИрдЪ рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ)ред

рд░рд┐рдЯреНрд░реАрдЯред рдРрдб-рдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд╛рдг рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдУрд╡рд░рд▓реИрдк рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрд╕ рдХреЗ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрд╕ i рдХреЗ рдкреНрд░рддреНрдпрдп рдХреЗ рдЕрдзрд┐рдХрддрдо рдореИрдЪ рдХреА рд▓рдВрдмрд╛рдИ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рдПрдХ рдСрд░реНрдбрд░ рдХреА рдЧрдИ рдЬреЛрдбрд╝реА (S i , S j ) рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд▓реИрдк рдХреА рдЧрдгрдирд╛ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред
рдЫрд╡рд┐


рдУрд╡рд░рд▓реИрдк рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

/* *       s1 *     s2 (  s1  s2) */ private static int overlap(String s1, String s2) { int s1last = s1.length() - 1; int s2len = s2.length(); int overlap = 0; for (int i = s1last, j = 1; i > 0 && j < s2len; i--, j++) { String suff = s1.substring(i); String pref = s2.substring(0, j); if (suff.equals(pref)) overlap = j; } return overlap; } 


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓реМрдЯреЗрдВред рдпрджрд┐ рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ S = {abc, cde, eab} рдХреЛ рдЙрдирдХреЗ рдУрд╡рд░рд▓реИрдкреНрд╕ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ X = abcdeab 7 рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЫреЛрдЯрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рдирд╣реАрдВ рд╣реИред рд╕рдмрд╕реЗ рдЫреЛрдЯреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рддрдм рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рдПрдЧреА рдЬрдм 3-1-2 рдХреЗ рдХреНрд░рдо рдореЗрдВ рдУрд╡рд░рд▓реИрдкреНрд╕ рдХреЗ рд╕рд╛рде рддрд╛рд░ рдХреЛ рд╕рдорддрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдХреНрд╕ = рдИрдмрдХреЗрдб рдХреА рд▓рдВрдмрд╛рдИ 6. рд╣реЛрдЧреАред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдЕрдкрдиреЗ рдУрд╡рд░рд▓реИрдк рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рд╕рдорд╡рд░реНрддреА рддрд╛рд░реЛрдВ рдХреЗ рдЗрд╖реНрдЯрддрдо рдХреНрд░рдо рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рдХрд┐рдпрд╛ред

рдкреНрд░рддрд┐рдмрдВрдзред рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рд╕реБрдкрд░рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдореМрдЬреВрджрд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрдирдкреБрдЯ рд╕реЗрдЯ рдХреА рдХреЛрдИ рднреА рд▓рд╛рдЗрди рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рд░реЗрдЦрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рдирд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпрдп рдХреЗ рдкреЗрдбрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдпрддрд╛ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рд▓рд╛рд▓рдЪреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо


рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рд╣рдо рдХрд┐рд╕реА рднреА рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЕрдзрд┐рдХрддрдо рдУрд╡рд░рд▓реИрдк рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдореЗрдВ рд╡рд┐рд▓рдп рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╖реНрдЯрддрдо рдПрдХ рдХреЗ рдХрд░реАрдм рд╣реЛрдЧрд╛ред

1. рдЬрдмрдХрд┐ S рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд░реЗрдЦрд╛рдПрдБ рд╣реИрдВ, рд╣рдо рдЕрдзрд┐рдХрддрдо рдУрд╡рд░рд▓реИрдк рдХреЗ рд╕рд╛рде рджреЛ рд░реЗрдЦрд╛рдПрдБ рдкрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдореЗрдВ рдорд┐рд▓рд╛рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ABCD + CDEFG = ABCDEFG)ред
2. рд╣рдо рдПрд╕ рдореЗрдВ рдмрдЪреА рдПрдХ рд▓рд╛рдЗрди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

  /* *         , *      ( ). */ public static String createSuperString(ArrayList<String> strings) { while (strings.size() > 1) { int maxoverlap = 0; String msi = strings.get(0), msj = strings.get(1); for (String si : strings) for (String sj : strings) { if (si.equals(sj)) continue; int curoverlap = overlap(si, sj); if (curoverlap > maxoverlap) { maxoverlap = curoverlap; msi = si; msj = sj; } } strings.add(merge(msi, msj, maxoverlap)); strings.remove(msi); strings.remove(msj); } return strings.get(0); } 


рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдФрд░ рд╕рд░рд▓ рдорд░реНрдЬ рдлрд╝рдВрдХреНрд╢рди рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдЬреЛ рдПрдХ рдУрд╡рд░рд▓реИрдк рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рджреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рдорд┐рд▓рд╛ рджреЗрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреА рдЧрдгрдирд╛ рдкрд╣рд▓реЗ рд╣реА рдХреА рдЬрд╛ рдЪреБрдХреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред

  /* *    s1  s2   len,   *   overlap(s1, s2) */ private static String merge(String s1, String s2, int len) { s2 = s2.substring(len); return s1 + s2; } 


рдПрдХ рдЙрджрд╛рд╣рд░рдг ( рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ ):
тЧП рджрд░реНрдЬ рдХрд░реЗрдВ : S = {"ab k ", "b k c", "b k + 1 "}
тЧП рд▓рд╛рд▓рдЪреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ : 4 + 4 k рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде "ab k cb k + 1 "
тЧП рдЗрд╖реНрдЯрддрдо рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ : 4 + 2k рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде "ab k + 1 c"

рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рд╕рдиреНрдирд┐рдХрдЯрди рдХрд╛рд░рдХ рдЫрд╡рд┐

4-рдЕрдиреБрдорд╛рдирд┐рдд рдмреНрд▓реВрдо-рдпрд╛рдВрдЧ-рд▓реА-рдЯреНрд░реЙрдордк-рдпрд╛рдирд╛рдХрдХрд┐рд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо


рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдХреЛрдИ рдирд╛рдо рдирд╣реАрдВ рд╣реИ рдФрд░ рдХреЛрдИ рднреА рдЗрд╕реЗ рдореЗрд░реА рддрд░рд╣ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИред рдЗрд╕реЗ рдмрд╕ рд╕рдмрд╕реЗ рдЫреЛрдЯреА рд╕реБрдкрд░рд▓рд╛рдЗрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП 4-рдЕрдиреБрдорд╛рдирд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рдмреНрд▓рдо, рдпрдВрдЧ, тАЛтАЛрд▓реА, рдЯреНрд░рдореНрдк рдФрд░ рдпрд╛рдирд╛рдХрд┐рд╕ рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдП, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреА рд╣реЗрдбрд▓рд╛рдЗрди рдХреНрдпреЛрдВ рдирд╣реАрдВ рджреА рдЧрдИ?

рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП , рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рджреМрд░рд╛рди рдореИрдВ S = {S 0 : "cde", S 1 : "abc", S 2 : "eab", S 3 : "fgh, S 4 :" рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрдкрд░рд▓рд╛рдЗрди рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред ghf тАЭ, S 5 :тАЬ hed тАЭ} ред

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдПрдХ рдкреВрд░реНрдг рджрд┐рд╢рд╛рддреНрдордХ рднрд╛рд░рд┐рдд рдЧреНрд░рд╛рдл рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдкреВрд░реНрдг рд▓рдВрдмрд╛рдИ рдХреЗ рдЪрдХреНрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд░рдгреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ, рдЬрд┐рдирдХреЗ рдХреЛрдиреЗ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╕реЗрдЯ рдХреА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВ рдФрд░ S i рд╕реЗ S j рддрдХ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдХрд╛ рд╡рдЬрди рд╕рднреА i, j рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд▓реИрдк (S i , S j ) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред

рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдл (рджреГрд╢реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдиреЗ рдПрд╕ рдХреЗ рдмрдЬрд╛рдп i рджреНрд╡рд╛рд░рд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╣реИрдВ):
рдЫрд╡рд┐


рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдореИрдВ рдЗрд╕ рдЧреНрд░рд╛рдл рдХреЛ рдПрдХ рдЖрд╕рдиреНрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реВрдБрдЧрд╛, рдЬреЛ рдирд┐рдореНрди рд╕реВрдЪреА рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рднреЛрдЬрдкреВрд░реНрдг рддрд░реАрдХреЗ рд╕реЗ рдмрдиреЗрдЧрд╛ (рдзрд╛рд░рд╛ 16.17 [1] рдбреАред рдореЗрдВ рдЧреИрд╕рдлреАрд▓реНрдб рдХрд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдмрди рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдпрд╣ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рд╡рд╣ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛)ред

  int n = strings.size(); //   overlap'   //   (Si, Sj). int[][] overlaps = new int[n][n]; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) overlaps[i][j] = overlap(strings.get(i), strings.get(j)); 


рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрд╕рдиреНрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
рдЫрд╡рд┐


рдЖрд╕рдиреНрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж, рдиреНрдпреВрдирддрдо рдкреВрд░реНрдг рд▓рдВрдмрд╛рдИ рдХреЗ рдЪрдХреНрд░ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЖрд╡рд░рдг рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ "рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рдорд╕реНрдпрд╛" рдХреЛ рдХрдо рдХрд░рдХреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╡рд░реЗрдЬ рдХреЛ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ, рдХрд╛рд░реНрдп рдЕрдзрд┐рдХрддрдо рд╡рдЬрди рдХрд╛ рдкреВрд░рд╛ рдЙрджреНрджреЗрд╢реНрдп рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдпрд╣ рдХрджрдо рдкреНрд░рдореБрдЦ рд╕рдордп рд▓реЗрддрд╛ рд╣реИ)ред рддреЗрдЬрд╝ рдФрд░ рдЖрд╕рд╛рди ([1] p.16.19.13) рдпрд╣ рдЧрдВрддрд╡реНрдп рд▓рд╛рд▓рдЪреА рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд▓рд╛рд▓рдЪреА рдирд┐рдпреБрдХреНрддрд┐ ([рез] p.16.19.13)

рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛: рдореИрдЯреНрд░рд┐рдХреНрд╕ рдП рдЖрдХрд╛рд░ k ├Ч kред
рдкрд░рд┐рдгрд╛рдо: рдкреВрд░реНрдг рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдПрдоред

  1. рдПрдо = ├Ш рд░рдЦреЛ рдФрд░ рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдПрдХ рд╕реБрд▓рдн рдШреЛрд╖рд┐рдд рдХрд░реЗрдВред
  2. рдЬрдмрдХрд┐ A рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╣реИрдВ
    1. рдЙрдкрд▓рдмреНрдз рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕реЗ, рдЙрдЪреНрдЪрддрдо рд╡рдЬрди рд╡рд╛рд▓реЗ рд╕реЗрд▓ (i, j) рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред
    2. M рдореЗрдВ рд╕реЗрд▓ (i, j) рд░рдЦреЗрдВ рдФрд░ рдкрдВрдХреНрддрд┐ I рдФрд░ рдХреЙрд▓рдо j рдХреЛ рджреБрд░реНрдЧрдо рдореЗрдВ рд╕реЗрд▓ рдмрдирд╛рдПрдБред
    3. рдЕрдВрдд;
  3. рдкреВрд░реНрдг рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЬрд╛рд░реА рдХрд░реЗрдВ рдПрдоред


рдЖрдк рдПрдХ рд╕рд░рдгреА (int [] M = new int [k]) рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдб рдореЗрдВ M рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд░реНрджреЗрд╢ 2.2 рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЛ M [i] = j рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ; рдЪреВрдВрдХрд┐ рдкреВрд░реНрдг рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдирдВрдмрд░ 0 рд╕реЗ k рддрдХ рдкрдВрдХреНрддрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмрд╛рд░ рдФрд░ рд╕реНрддрдВрдн рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИред

рдкреВрд░реНрдг рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЧрдгрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

  /* * ,     *   .  - O(k*k*log(k)) */ private static int[] assignment(int[][] a) { int n = a.length; boolean[][] notallow = new boolean[n][n]; int[] m = new int[n]; while (true) { int max = -1, maxi = -1, maxj = -1; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (notallow[i][j]) continue; if (a[i][j] > max) { max = a[i][j]; maxi = i; maxj = j; } } } if (max == -1) break; m[maxi] = maxj; for (int i = 0; i < n; i++) { notallow[maxi][i] = true; notallow[i][maxj] = true; } } return m; } 


рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд╛рд▓рдЪреА рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реНрдг рдЕрдзрд┐рдХрддрдо рднрд╛рд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЪрд░рдг-рджрд░-рдЪрд░рдг рдЧрдгрдирд╛:

рдЫрд╡рд┐


рдЕрдм рдЬрдм рдЕрдзрд┐рдХрддрдо рднрд╛рд░ рдХреЗ рдкреВрд░реНрдг рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╣реИ, рддреЛ рдиреНрдпреВрдирддрдо рдХреБрд▓ рд▓рдВрдмрд╛рдИ рдХреЗ рдЪрдХреНрд░реЛрдВ рдореЗрдВ рдХрд╡рд░реЗрдЬ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП:

рдХрд┐рд╕реА рднреА (рддрд╛рд░реНрдХрд┐рдХ - рд╢реВрдиреНрдп) рдкреВрд░реНрдг-рдЙрджреНрджреЗрд╢реНрдп рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕реЗ рд▓реВрдк рдореЗрдВ рдбрд╛рд▓реЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рд▓реВрдк рд╕реНрдЯрд╛рд░реНрдЯ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЪрдХреНрд░ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ, рдЗрд╕реЗ рдЪрдХреНрд░ рдХреЗ рдХрд╡рд░ рдореЗрдВ рдбрд╛рд▓реЗрдВ рдФрд░ рдПрдХ рдирдпрд╛ рдЪрдХреНрд░ рд╢реБрд░реВ рдХрд░реЗрдВ, рд╢реБрд░реБрдЖрдд рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рд▓реЗ рдЕрдирд▓реЗрдмрд▓ рддрддреНрд╡ рдХреЛ рд▓реЗрддреЗ рд╣реБрдПред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЗрд╕ рдорд╛рди рдХреЛ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдВ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рддрдм рддрдХ рджреЛрд╣рд░рд╛рдПрдВ рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рддрддреНрд╡ рдЪрд┐рд╣реНрдирд┐рдд рди рд╣реЛ рдЬрд╛рдПрдВред

рд▓реВрдк рдХреА рдореЗрдореЛрд░реА рдХрд╡рд░реЗрдЬ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдкрдВрдХреНрддрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ (рдЕрд╕рд╛рдЗрди - рдкреВрд░реНрдг рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ):

  //       //    assign ArrayList<ArrayList<Integer>> cycles = new ArrayList<ArrayList<Integer>>(); ArrayList<Integer> cycle = new ArrayList<Integer>(); boolean[] mark = new boolean[assign.length]; for (int i = 0; i < assign.length; i++) { if (mark[i]) continue; cycle.add(i); mark[i] = true; if (assign[i] == cycle.get(0)) { cycles.add(cycle); cycle = new ArrayList<Integer>(); i = 0; } else { i = assign[i] - 1; } } 


рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реВрдк рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░реЗрдЬ рдвреВрдВрдврдирд╛ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:

рдЫрд╡рд┐


рдЪрдХреНрд░ рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА рдХрд╡рд░реЗрдЬ рдХреЛ рдореВрд▓ рдЧреНрд░рд╛рдл рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЙрди рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЬреЛ рдХрд╡рд░реЗрдЬ рдореЗрдВ рдЧрд┐рд░ рдЧрдПред
рдЫрд╡рд┐


рд╡рд┐рдзрд╛рдирд╕рднрд╛ред рдЕрдм рдЬрдм рдХрд╡рд░реЗрдЬ рдХреЗ рд╕рднреА рдЪрдХреНрд░реЛрдВ рдХреА рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╣реИ, рддреЛ рдЖрдк рд╕реАрдзреЗ, рд╕реБрдкрд░рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдкрд╕рд░реНрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ S 1 рдФрд░ S 2 рдХреЛ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ S 1 рдХреЛ рджрд╛рдПрдВ рд╕реЗ рдУрд╡рд░рд▓реИрдк (S 1 , S 2 ) рд╡рд░реНрдгреЛрдВ рд╕реЗ рдХрд╛рдЯ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рд╕рднреА рдУрд╡рд░рд▓реИрдкреНрд╕ рдХреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рдФрд░ рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реЗ рдЬрд╛рдП рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  /* *    s1,   *  ov  */ private static String prefix(String s1, int ov) { return s1.substring(0, s1.length() - ov); } 


рдЕрдм, рдкреНрд░рддреНрдпреЗрдХ рдЪрдХреНрд░ C i = {S 1 , S 2 , ..., S k-1 , S k } рдХреЗ рд▓рд┐рдП, рдЙрдк-рд▓рд╛рдЗрди X Ci = рдЙрдкрд╕рд░реНрдЧ (S 1 , рдУрд╡рд░рд▓реИрдк (S 1 , S 2 )) ++ рдЙрдкрд╕рд░реНрдЧ (S 2 ) рдХреЛ рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред , рдУрд╡рд░рд▓реИрдк (S 2 , S ...)) ++ рдЙрдкрд╕рд░реНрдЧ (S ..., рдУрд╡рд░рд▓реИрдк (S ..., S k-1 )) ++ k k ред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐, рдЪреВрдВрдХрд┐ рдПрдХ рдХрд╡рд░реЗрдЬ рдореЗрдВ рд▓реВрдкреНрд╕ рд▓реВрдк рд╣реИрдВ , рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЪрдХреНрд░реАрдп рд░реВрдк рд╕реЗ рдореЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХреНрд╕ рд╕реА рд╕реБрдкрд░рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЗ рд╕рд╛рде рдХрд┐рд╕ рд▓рд╛рдЗрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИред рдЙрддреНрддрд░ рд╕рд░рд▓ рд╣реИ - рдЖрдкрдХреЛ рд▓реВрдк рдХреЛ рд╢рд┐рдлреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЕрдВрддрд┐рдо рдФрд░ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЗ рдУрд╡рд░рд▓реИрдк рдХреЛ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ ред

рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЪрдХреНрд░реАрдп рдХреЛрдЯрд┐рдВрдЧ рдХреЗ рдкрд╣рд▓реЗ рдЪрдХреНрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдЫрд╡рд┐


рдпрджрд┐ рдЖрдк рдЕрдВрддрд┐рдо рдФрд░ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдУрд╡рд░рд▓реИрдк рдХреЛ рдХрдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди C 0 = {1, 0, 2} рд▓реЗрдВ, рддреЛ рд▓рд╛рдЗрди X C0 = abc ++ cde ++ eb = abcdeab рд╣реЛрдЧреА, рдЬреЛ рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рд╕рдмрд╕реЗ рдХрдо рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рд▓реВрдк рдореЗрдВ рдиреНрдпреВрдирддрдо рдУрд╡рд░рд▓реИрдк 1 рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЕрдиреБрдХреНрд░рдо {0, 2, 1} (cde ++ eab ++ abc = cdeabc) рдпрд╛ {2, 1, 0} (eab ++ abc ++ cc =) eabcde)ред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рдХреЛрдб рд╣реИ рдЬреЛ рдХрд╡рд░реЗрдЬ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЪрдХреНрд░ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЪрдХреНрд░ рдХреА рдкрд╣рд▓реА рдФрд░ рдЖрдЦрд┐рд░реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдУрд╡рд░рд▓реИрдк рдХреЛ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЪрдХреНрд░ рдХреЗ рд▓рд┐рдП рдРрдб-рдЗрдиреНрд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

  //       ,  //  overlap       //      . ArrayList<String> superstrings = new ArrayList<String>(); for (ArrayList<Integer> c : cycles) { String str = ""; ArrayList<Integer> ovs = new ArrayList<Integer>(); for (int i = 0; i < c.size() - 1; i++) ovs.add(overlaps[c.get(i)][c.get(i+1)]); int min = overlaps[c.get(c.size()-1)][c.get(0)]; int shift = 0; for (int i = 0; i < ovs.size(); i++) if (ovs.get(i) < min) { min = ovs.get(i); shift = i + 1; } Collections.rotate(c, -shift); for (int i = 0; i < c.size() - 1; i++) str += prefix(strings.get(c.get(i)), overlaps[c.get(i)][c.get(i+1)]); str += strings.get(c.get(c.size()-1)); superstrings.add(str); } 


рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╡рд░реЗрдЬ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЪрдХреНрд░ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рдРрдб-рдЗрдиреНрд╕ рд╣реИред 4 рдХреЗ рдХрд╛рд░рдХ рдХреЗ рд╕рд╛рде рдорд╛рдирд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рд░рд▓ рд╕рдВрдпреЛрдЬрди рдорд╛рдирддрд╛ рд╣реИред

  //     superstrings StringBuilder superstring = new StringBuilder(); for (String str : superstrings) superstring.append(str); return superstring.toString(); 


рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдкрд░реАрдХреНрд╖рдг


рд▓рд╛рд▓рдЪреА (Greedy.java) рдФрд░ рдмреНрд▓рдо-рдпрд╛рдВрдЧ-рд▓реА-рдЯреНрд░реЙрдордк-рдпрд╛рдирд╛рдХрдХрд┐рд╕ (Assign.java) рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдХреЛрдб рдмрд┐рдЯ рдмрд┐рдЯрдХреЙрдЗрди.org.andkorsh/scss/src рдкрд░ рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреНрд▓рд╛рд╕ Main.java рднреА рд╣реИ, рдЬреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдЧрддрд┐ рдФрд░ рдЗрдирдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкрде рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрдн рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреВрдЫрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЦреНрдп рд╡рд░реНрдЧ рд╕реНрд╡рдпрдВ рдЗрдирдкреБрдЯ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЛ "рдпрд╛рджреГрдЪреНрдЫрд┐рдХ" рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рдЕрдзрд┐рдХрддрдо рд▓рд╛рдЗрди рдХреА рд▓рдВрдмрд╛рдИ, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рдпрд╛ рдирд╣реАрдВ рдФрд░ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд░рд┐рдкреЛрд░реНрдЯ output.txt рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИред

рд╕реНрд░реЛрдд рдХреЛрдб "1.6.0_05" рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЬрд╛рд╡рд╛рдХ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред

рдореБрдЦреНрдп рд╡рд░реНрдЧ рдХреЗ рдкрд░реАрдХреНрд╖рдг рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  private static int test(ArrayList<String> substrings, String superstring) { int errors = 0; for (String substring : substrings) if (superstring.indexOf(substring) < 0) errors++; return errors; } 


рд╕рд╛рд╣рд┐рддреНрдп рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛


[рез] : рдбреИрди рдЧреИрд╕рдлрд╝реАрд▓реНрдбред рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рд▓рд╛рдЗрдиреЗрдВ, рдкреЗрдбрд╝ рдФрд░ рдХреНрд░рдоред рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдФрд░ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЬреАрд╡ рд╡рд┐рдЬреНрдЮрд╛рдиред рдиреЗрд╡рд╕реНрдХреА рдмреЛрд▓реА, BHV-рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ, 2003 - 656 рдкреА .: рдЖрдИрдПрд╕рдмреАрдПрди 5-7940-0103-8, 5-94157-321-9, 0-521-58519-8ред
www.ozon.ru/context/detail/id/1393109

[реи] : рдбреИрди рдЧреБрд╕рдлрд╝реАрд▓реНрдбред рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕, рдЯреНрд░реАрдЬрд╝ рдФрд░ рд╕реАрдХреНрд╡реЗрдВрд╕ рдкрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо: рдХрдВрдкреНрдпреВрдЯрд░ рд╕рд╛рдЗрдВрд╕ рдФрд░ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдмрд╛рдпреЛрд▓реЙрдЬреАред рдХреИрдВрдмреНрд░рд┐рдЬ, 1997 рдХреА рдПрдХрддрд╛ рдХрд╛ рджрдмрд╛рд╡ - 534 рдкреА .: рдЖрдИрдПрд╕рдмреАрдПрди -10: 0521585198, рдЖрдИрдПрд╕рдмреАрдПрди -13: 978-0521585194ред
www.amazon.com/Algorithms-Strings-Trees-Sequences-Computational/dp/0521585198

[рей] : рд╢реБрдирдЬреА рд▓реА, рд╡реЗрдирдЭреЗрдВрдЧ рдЪреАред рд╡реНрдпрд╛рдЦреНрдпрд╛рди # 3: рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕реБрдкрд░рд╕реНрдЯреНрд░рд┐рдВрдЧ - CS 352 (рдЙрдиреНрдирдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо), рд╕реНрдкреНрд░рд┐рдВрдЧ 2011ред
cs.carleton.edu/faculty/dlibenno/old/cs352-spring11/L03-shortest-superstring.pdf

Source: https://habr.com/ru/post/In201656/


All Articles