JXNVCE ALGO-LOG YouJin Jung

GFG NAIVE PATTERN SEARCHING

#include <bits/stdc++.h>
using namespace std;
 
void search(char* pat, char* txt) {
    int M = strlen(pat);
    int N = strlen(txt);
 
    for (int i = 0; i <= N - M; i++) {
        int j;
        for (j = 0; j < M; j++)
            if (txt[i + j] != pat[j])
                break;
 
        if (j == M) 
            cout << "Pattern found at index " << i << endl;
    }
}
 
int main() {
    char txt[] = "AABAACAADAABAAABAA";
    char pat[] = "AABA";
    search(pat, txt);
    return 0;
}

GFG LEXICOGRAPHIC RANK OF STRING

#include <bits/stdc++.h>
#include <string.h>
 
using namespace std;

int fact(int n) {
    return (n <= 1) ? 1 : n * fact(n - 1);
}

int findSmallerInRight(char* str, int low, int high) {
    int countRight = 0, i;
 
    for (i = low + 1; i <= high; ++i)
        if (str[i] < str[low])
            ++countRight;
 
    return countRight;
}
 
int findRank(char* str) {
    int len = strlen(str);
    int mul = fact(len);
    int rank = 1;
    int countRight;
    int i;

    for (i = 0; i < len; ++i) {
        mul /= len - i;
        countRight = findSmallerInRight(str, i, len - 1);
 
        rank += countRight * mul;
    }
 
    return rank;
}

int main() {
    char str[] = "string";
    cout << findRank(str);
    return 0;
}

GFG JOB SEQUENCING

Using Greedy!

#include<iostream>
#include<algorithm>

using namespace std;
  
struct Job {
   char id;     // Job Id
   int dead;    // Deadline of job
   int profit;  // Profit if job is over before or on deadline
};

// sorting all jobs according to profit
bool comparison(Job a, Job b) {
     return (a.profit > b.profit);
}
  
// Returns minimum number of platforms required
void printJobScheduling(Job arr[], int n) {
    // Sort all jobs according to decreasing order of profit
    sort(arr, arr+n, comparison);
  
    int result[n]; 
    bool slot[n]; 

    for (int i=0; i<n; i++)
        slot[i] = false;
    for (int i=0; i<n; i++) {
       for (int j=min(n, arr[i].dead)-1; j>=0; j--) {
          if (slot[j]==false) {
             result[j] = i;  // Add this job to result
             slot[j] = true; // Make this slot occupied
             break;
          }
       }
    }
  
    for (int i=0; i<n; i++)
       if (slot[i])
         cout << arr[result[i]].id << " ";
}
  
int main() {
    Job arr[] = { {'a', 2, 100}, {'b', 1, 19}, {'c', 2, 27},
                   {'d', 1, 25}, {'e', 3, 15}};
    int n = sizeof(arr)/sizeof(arr[0]);
    cout << "Following is maximum profit sequence of jobs 
    printJobScheduling(arr, n);
    return 0;
}

GFG RABIN KARP

#include <bits/stdc++.h>
using namespace std;

#define d 256
 
void search(char pat[], char txt[], int q) {
    int M = strlen(pat);
    int N = strlen(txt);
    int i, j;
    int p = 0; // hash value for pattern
    int t = 0; // hash value for txt
    int h = 1;

    for (i = 0; i < M - 1; i++)
        h = (h * d) % q;
    for (i = 0; i < M; i++) {
        p = (d * p + pat[i]) % q;
        t = (d * t + txt[i]) % q;
    }

    for (i = 0; i <= N - M; i++) {

        if ( p == t ) {  

            for (j = 0; j < M; j++)
            {
                if (txt[i+j] != pat[j])
                {
                  flag = false;
                  break;
                }
                  if(flag)
                  cout<<i<<" ";
                      
            }
           
            if (j == M)
                cout<<"Pattern found at index "<< i<<endl;
        }

        if ( i < N-M ){
            t = (d*(t - txt[i]*h) + txt[i+M])%q;
            if (t < 0)
            t = (t + q);
        }
    }
}
 
int main() {
    char txt[] = "GEEKS FOR GEEKS";
    char pat[] = "GEEK";
    int q = 101;
    search(pat, txt, q);
    return 0;
}

GFG LONGEST PALINDROMIC SUBSTRING (BRUTE FORCE)

Brute force 방식을 활용한 제일 긴 palindromic substring 찾기

#include <bits/stdc++.h>
using namespace std;

void printSubStr(string str, int low, int high) {
    for (int i = low; i <= high; ++i)
        cout << str[i];
}

int longestPalSubstr(string str) {
    int n = str.size();
    int maxLength = 1, start = 0;

    // Nested loop to mark start and end index
    for (int i = 0; i < str.length(); i++) {
        for (int j = i; j < str.length(); j++) {
            int flag = 1;

            // Check palindrome
            for (int k = 0; k < (j - i + 1) / 2; k++)
                if (str[i + k] != str[j - k])
                    flag = 0;

            // Palindrome
            if (flag && (j - i + 1) > maxLength) {
                start = i;
                maxLength = j - i + 1;
            }
        }
    }

    cout << "Longest palindrome substring is: ";
    printSubStr(str, start, start + maxLength - 1);
    return maxLength;
}

int main() {
    string str = "forgeeksskeegforgeeks";
    cout << "\nLength is: " << longestPalSubstr(str);
    return 0;
}