Lesson 4
String Manipulation: Finding All Substring Occurrences in Java
Introduction

Hello, and welcome to our analysis lesson. In this lesson, we will be tackling a common problem in the field of string manipulations with Java. We will learn how to find all occurrences of a substring within a larger string. The techniques you will master today can be utilized in numerous situations, such as text processing and data analysis. Are you ready to get started? Let's jump right in!

Task Statement and Description

Here is this unit's task: We have two lists of strings, both of identical lengths — the first containing the "original" strings and the second containing the substrings. Our goal is to detect all occurrences of each substring within its corresponding original string and, finally, return a list that contains the starting indices of these occurrences. Remember, the index counting should start from 0.

Example

Let's consider the following lists: Original List: { "HelloWorld", "LearningJava", "GoForBroke", "BackToBasics" } Substring List: { "loW", "ear", "o", "Ba" }.

The following are the expected outputs: In "HelloWorld", "loW" starts at index 3. In "LearningJava", "ear" starts at index 1. In "GoForBroke", "o" appears at indices 1, 3, and 7. In "BackToBasics", "Ba" starts at indices 0 and 6.

Thus, when findSubString(Arrays.asList("HelloWorld", "LearningJava", "GoForBroke", "BackToBasics"), Arrays.asList("loW", "ear", "o", "Ba")) is invoked, the function should return:

1{ 2 "The substring 'loW' was found in the original string 'HelloWorld' at position(s) 3.", 3 "The substring 'ear' was found in the original string 'LearningJava' at position(s) 1.", 4 "The substring 'o' was found in the original string 'GoForBroke' at position(s) 1, 3, 7.", 5 "The substring 'Ba' was found in the original string 'BackToBasics' at position(s) 0, 6." 6}

Although this task may seem fairly straightforward, it can prove challenging. However, don't worry! We will break it down step by step.

Step-by-Step Solution: Step 1, Creating the Output List

Initially, we need to create a space to store our results. Can you think of a Java data type that would be ideal for this task? That's right! An ArrayList would be perfect!

Java
1import java.util.ArrayList; 2import java.util.List; 3 4public class Solution { 5 public static List<String> findSubString(List<String> origStrs, List<String> substrs) { 6 List<String> result = new ArrayList<>();
Step 2: Pairing Strings and Locating First Occurrence

To pair original strings with their substrings, we use a simple for loop. In our case, both lists share the same length, so we can use their indices to pair them correctly. To find the first occurrence of each substring in the corresponding original string, we utilize the indexOf method:

Java
1 for (int i = 0; i < origStrs.size(); i++) { 2 int start_pos = origStrs.get(i).indexOf(substrs.get(i));

In string.indexOf(substr), we provide the substring that we intend to locate. The function starts its search from the beginning because we have not specified a starting position.

Step 3: Locating Subsequent Occurrences

The next step is to find the subsequent instances of the substring in the original.

To do this, we will use a while loop. But when should we stop looking for more occurrences? When our indexOf function returns -1, it indicates there are no more matches to be found.

Each time we locate a match, we record its starting index in the match_indices list, adjust the start_pos, and begin the search anew:

Java
1 List<Integer> match_indices = new ArrayList<>(); 2 while (start_pos != -1) { 3 match_indices.add(start_pos); 4 start_pos = origStrs.get(i).indexOf(substrs.get(i), start_pos + substrs.get(i).length()); 5 }
Step 4: Formatting and Storing the Results

Finally, we employ StringBuilder to format the result for improved readability and add it to the result list:

Java
1 if (!match_indices.isEmpty()) { 2 StringBuilder sb = new StringBuilder(); 3 sb.append("The substring '").append(substrs.get(i)).append("' was found in the original string '") 4 .append(origStrs.get(i)).append("' at position(s) "); 5 for (int idx : match_indices) 6 sb.append(idx).append(", "); 7 sb.setLength(sb.length() - 2); // remove trailing comma and space 8 sb.append("."); 9 result.add(sb.toString()); 10 } 11 } 12 return result; 13 } 14}

That's it! We have completed the design of our function.

The Complete Solution

Here is the complete function, incorporating all the steps we have discussed so far:

Java
1import java.util.ArrayList; 2import java.util.Arrays; 3import java.util.List; 4 5public class Solution { 6 public static List<String> findSubString(List<String> origStrs, List<String> substrs) { 7 List<String> result = new ArrayList<>(); 8 9 for (int i = 0; i < origStrs.size(); i++) { 10 int start_pos = origStrs.get(i).indexOf(substrs.get(i)); 11 List<Integer> match_indices = new ArrayList<>(); 12 13 while (start_pos != -1) { 14 match_indices.add(start_pos); 15 start_pos = origStrs.get(i).indexOf(substrs.get(i), start_pos + substrs.get(i).length()); 16 } 17 18 if (!match_indices.isEmpty()) { 19 StringBuilder sb = new StringBuilder(); 20 sb.append("The substring '").append(substrs.get(i)).append("' was found in the original string '") 21 .append(origStrs.get(i)).append("' at position(s) "); 22 for (int idx : match_indices) 23 sb.append(idx).append(", "); 24 sb.setLength(sb.length() - 2); // remove trailing comma and space 25 sb.append("."); 26 result.add(sb.toString()); 27 } 28 } 29 30 return result; 31 } 32 33 public static void main(String[] args) { 34 // Call the function 35 List<String> result = findSubString( 36 Arrays.asList("HelloWorld", "LearningJava", "GoForBroke", "BackToBasics"), 37 Arrays.asList("loW", "ear", "o", "Ba") 38 ); 39 for (String res : result) { 40 System.out.println(res); 41 } 42 } 43}
Lesson Summary

Well done! You've mastered a central operation in string manipulations in Java — finding all occurrences of a substring in another string. Keep in mind that this algorithm has numerous applications in real-world scenarios. Now that we have intricately dissected the problem and provided a detailed solution, I encourage you to practice more. Future exercises will help you hone your skills further. Keep on coding and exploring!

Enjoy this lesson? Now it's time to practice with Cosmo!
Practice is how you turn knowledge into actual skills.