DEV Community

Prashant Mishra
Prashant Mishra

Posted on • Edited on

String

Reverse words in a String

TC O(n) where n is number of words in the String

import java.util.StringJoiner;
class Solution {
    public String reverseWords(String s) {
        String[] ch = s.split(" ");
        int i =0,j=ch.length/2;
        while(i<j){
            String temp = ch[i];
            ch[i] = ch[ch.length-i-1];
            ch[ch.length-i-1] = temp;
            i++;
        }
        StringJoiner sJoiner = new StringJoiner(" ");
        for(int k =0;k<ch.length;k++){
            if(!ch[k].equals(""))
                sJoiner.add(ch[k]);
        }
        return sJoiner.toString().trim();
    }
}
Enter fullscreen mode Exit fullscreen mode

Roman to Integer

TC: O(n), where n is size of the String.

class Solution {
    public int romanToInt(String s) {
        HashMap<Character,Integer> map =new HashMap<>();
        map.put('I',1);
        map.put('V',5);
        map.put('X',10);
        map.put('L',50);
        map.put('C',100);
        map.put('D',500);
        map.put('M',1000);
        int integerValue = 0;
        int i = s.length()-1;
        while(i>0){
            if(s.charAt(i)=='V' && s.charAt(i-1)=='I'){
                integerValue+=4;
                i=i-2;
            }
            else if(s.charAt(i)=='X' && s.charAt(i-1)=='I'){
                integerValue+=9;
                i = i-2;
            }
            else if(s.charAt(i)=='L' && s.charAt(i-1)=='X'){
                integerValue+=40;
                i = i-2;
            }
            else if(s.charAt(i)=='C' && s.charAt(i-1)=='X'){
                integerValue+=90;
                i = i-2;
            }
            else if(s.charAt(i)=='D' && s.charAt(i-1)=='C'){
                integerValue+=400;
                i = i-2;
            }
            else if(s.charAt(i)=='M' && s.charAt(i-1)=='C'){
                integerValue+=900;
                i = i-2;
            }
            else{

                integerValue+=map.get(s.charAt(i));
                i--;
            }

        }
        if(i==0) integerValue+=map.get(s.charAt(i));
        return integerValue;
    }
}


Enter fullscreen mode Exit fullscreen mode

Sentences that contains all the given phrases

Note: I was asked this question in MSCI coding interview question

/*package whatever //do not write package name here */

import java.io.*;
import java.util.*;

class GFG {
    public static void main (String[] args) {
        List<String> sentence= new ArrayList<>();
        List<String> queries = new ArrayList<>();
        sentence.add("bob and alice like to text each other");
        sentence.add("bob does not like to ski but does not like to fall");
        sentence.add("Alice likes to ski");

        queries.add("bob alice");
        queries.add("alice");
        queries.add("like");
        queries.add("non occurance");
        System.out.println(get(sentence,queries));

    }
    public static List<List<Integer>> get(List<String> sentence, List<String> q){
        List<List<Integer>> list = new ArrayList<>();
        for(int j =0;j<q.size();j++){
                List<Integer> res = new ArrayList<>();
                String str[] = q.get(j).split(" ");
                for(int i =0;i<sentence.size();i++){
                    String sen = sentence.get(i);
                    boolean present = true;
                    for(String s : str){
                        if(!sen.contains(s)){
                            present = false;
                            break;

                        }
                    }
                    if(present){
                        res.add(i);// sentence index that had s got added
                    }
                }
                if(res.isEmpty()){
                    List<Integer> temp = new ArrayList<>();
                    temp.add(-1);
                    list.add(temp);
                }
                else list.add(res);

            }
        return list;
    }
}
Enter fullscreen mode Exit fullscreen mode

Longest palindromic substring

TC:O(n^2) for using two loops, space c: O(1)

class Solution {
    public String longestPalindrome(String s) {
        //the lcs approach won't work here
        //we will have to use traditional approach of two loops for finding longest
        //palindromic subsequence
        int start=0;
        int length = 1;
        int n = s.length();
        if(n<2) return s;
        for(int i =0;i<n;i++){
            int low = i-1;
            int high = i+1;
            //below will check till how long the index values of high are equal to current index
            //which will be palindrome obviously
            while(high < n && s.charAt(high) == s.charAt(i)){
                high++;
            }
            //same logic as above for low index
            while(low>=0 && s.charAt(low) == s.charAt(i)){
                low--;
            }
            //finally low and high together
            while(low >=0 && high<n && s.charAt(low)== s.charAt(high)){
                low--;
                high++;
            }
            int len  = high-low -1;
            if(len> length){
                length = len;
                start = low+1;
            }

        }
        //if we were to return length of the logest palindromic substring we could have returned 'length';
        return s.substring(start,start+length);
    }
}

Enter fullscreen mode Exit fullscreen mode

Compare verisons

TC: O(n) ,where n is the length of the longest version string

class Solution {
    public int compareVersion(String version1, String version2) {
        version1 = version1+".0";
        version2 = version2+".0";
        String[] a = version1.split("\\.");
        String[] b = version2.split("\\.");

        int exL = Math.abs(a.length - b.length);

        if(a.length > b.length){
            char c = '0';
            while(exL-->0){
                version2 = version2+"."+c;
            }
        }
        else {
            char c = '0';
            while(exL-->0){
                version1 = version1+"."+c;
            }
        }


        /// now two strings are equal
        a= version1.split("\\.");
        b = version2.split("\\.");
        System.out.println(a.length + " "+ b.length);
        for(int i =0;i<a.length;i++){
            int p = Integer.parseInt(a[i]);
            int q = Integer.parseInt(b[i]);
            if(p > q) return 1;
            if(p < q) return -1;
        }
        return 0;
    }
}
Enter fullscreen mode Exit fullscreen mode

Palindrome partitioning
TC: exponential : O(2^n)

class Solution {
    List<List<String>> getPartitions(String s) {
        // add logic here 
        List<List<String>> list = new ArrayList<>();
        f(s,0,new ArrayList<>(),list);
        return list;
    }
    public void f(String s, int index, List<String> l,List<List<String>> list){
        if(index>=s.length()){
            list.add(new ArrayList<>(l));
            return;
        }
        for(int i = index;i<s.length();i++){
            if(!isP(s,index,i)) continue;
            l.add(s.substring(index,i+1));
            f(s,i+1,l,list);
            l.remove(l.size()-1);
        }
    }
    public boolean isP(String s, int i,int e){
        while(i<=e){
            if(s.charAt(i++)!=s.charAt(e--)) return false;
        }
        return true;
    }
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)