| 1333 | } |
| 1334 | |
| 1335 | public static String overlapMaximally(String left, String right, int minOverlap) { |
| 1336 | String prefix = right.substring(0, minOverlap); |
| 1337 | int leftLength = left.length(); |
| 1338 | int rightLength = right.length(); |
| 1339 | |
| 1340 | int lowerL = 0; |
| 1341 | int maxLi = leftLength - minOverlap; |
| 1342 | |
| 1343 | while (lowerL >= 0 && lowerL <= maxLi) { |
| 1344 | lowerL = left.indexOf(prefix, lowerL); |
| 1345 | |
| 1346 | if (lowerL >= 0) { |
| 1347 | int upperL = lowerL+rightLength; |
| 1348 | if (upperL < leftLength) { |
| 1349 | // could `right` be contained in `left`? |
| 1350 | String leftTail = left.substring(lowerL+minOverlap, upperL); |
| 1351 | String rightTail = right.substring(minOverlap); |
| 1352 | if (leftTail.equals(rightTail)) { |
| 1353 | // overlap: rightLength |
| 1354 | return left; |
| 1355 | } |
| 1356 | } |
| 1357 | else { |
| 1358 | upperL = leftLength; |
| 1359 | String leftTail = left.substring(lowerL+minOverlap, upperL); |
| 1360 | String rightTail = right.substring(minOverlap, upperL-lowerL); |
| 1361 | if (leftTail.equals(rightTail)) { |
| 1362 | // overlap: leftLength - lowerL |
| 1363 | return left + right.substring(upperL-lowerL); |
| 1364 | } |
| 1365 | } |
| 1366 | ++lowerL; |
| 1367 | } |
| 1368 | } |
| 1369 | |
| 1370 | if (leftLength >= rightLength && left.contains(right)) { |
| 1371 | return left; |
| 1372 | } |
| 1373 | |
| 1374 | if (leftLength < rightLength && right.contains(left)) { |
| 1375 | return right; |
| 1376 | } |
| 1377 | |
| 1378 | return null; |
| 1379 | } |
| 1380 | |
| 1381 | public static String overlapMinimally(String left, String right, int minOverlap) { |
| 1382 | int li = left.length() - minOverlap; |