Bracket şəklində bir simli qırmaq üçün bütün mümkün yolları çap edin

Çətinlik səviyyəsi Ağır
Tez-tez soruşulur Amazon Bloomberg GE Healthcare Ardıc şəbəkələri
Recursion SimBaxılıb 214

Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.

Problem bəyanat

"Mötərizədə bir simli qırmaq üçün mümkün olan bütün yolları çap edin" problemində a sim "S". Verilən sətri qırmaq üçün bütün mümkün yolları tapın mötərizət forması. Bütün alt simləri mötərizədə () bağlayın.

Giriş Formatı

"S" simli olan ilk və yalnız bir sətir.

Çıxış formatı

Verilən sətri qırmaq üçün mümkün olan bütün yolları bracket_form-da çap edin. Hər sətirdə yalnız bir sətir var.

Məhdudiyyətlər

  • 1 <= | s | <= 10 ^ 3
  • s [i] kiçik İngilis əlifbası olmalıdır

misal

abcd
(a)(b)(c)(d)
(a)(b)(cd)
(a)(bc)(d)
(ab)(c)(d)
(ab)(cd)
(a)(bcd)
(abc)(d)
(abcd)

Alqoritm

Burada istifadə edirik rekursiya bu problemi həll etmək. İki parametr saxlayırıq: İşlənəcək növbəti simvolun indeksi və indiyə qədər çıxan simli. İndi işlənəcək növbəti simvol indeksindən başlayın. İşlənməmiş sətrin yaratdığı alt sətri çıxış səthinə əlavə edin və bütün sətri işləyənə qədər qalan sətirdə təkrarlayın. Çıxış sətirini yaratmaq üçün std :: substr istifadə edirik. substr (pos, n) cari sətrin poz mövqeyindən başlayan n uzunluqlu bir alt simli qaytarır.

  1. İşlənəcək növbəti simvol indeksindən başlayırıq.
  2. İşlənməmiş sətrin əmələ gətirdiyi alt sətri çıxış səthinə əlavə edin və bütün sətri işləyənə qədər qalan hissəsini təkrarlayın.
  3. Çıxış sətirini yaratmaq üçün substr (pos, n) istifadə edirik, bu da cari sətir olduqda poz mövqeyindən başlayan n uzunluqlu alt sətri qaytarır.

Həyata keçirilməsi

Mötərizə formada bir simli qırmaq üçün bütün mümkün yolları çap etmək üçün C ++ proqramı

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

void find_next(string s, int in, string t)
{
  if(in==s.length())
  {	
      cout<<t<<endl;
  }
  for(int i=in;i<s.length(); i++)
  {
      string temp = t;
      temp+="(";
      temp+=s.substr(in,i+1-in);
      temp+=")";
    find_next(s, i+1 , temp);
  }
}

int main()
{
  string s;
  cin>>s;
  find_next(s,0,"");
  return 0;
}

Mötərizədə bir simli qırmaq üçün bütün mümkün yolları çap etmək üçün Java proqramı

import java.util.Scanner;

class sum
{
    public static void find_next(String s, int in, String t)
    {
        if(in==s.length())
  {	
      System.out.println(t);
  }
  for(int i=in;i<s.length(); i++)
  {
      String temp = t;
      temp+="(";
      temp+=s.substring(in,i+1);
      temp+=")";
    find_next(s, i+1 , temp);
  }
    }
    public static void main(String[] args)
    {
        Scanner sr = new Scanner(System.in);
        String s = sr.next();
        find_next(s,0,"");
    }
}




tutcup
(t)(u)(t)(c)(u)(p)
(t)(u)(t)(c)(up)
(t)(u)(t)(cu)(p)
(t)(u)(t)(cup)
(t)(u)(tc)(u)(p)
(t)(u)(tc)(up)
(t)(u)(tcu)(p)
(t)(u)(tcup)
(t)(ut)(c)(u)(p)
(t)(ut)(c)(up)
(t)(ut)(cu)(p)
(t)(ut)(cup)
(t)(utc)(u)(p)
(t)(utc)(up)
(t)(utcu)(p)
(t)(utcup)
(tu)(t)(c)(u)(p)
(tu)(t)(c)(up)
(tu)(t)(cu)(p)
(tu)(t)(cup)
(tu)(tc)(u)(p)
(tu)(tc)(up)
(tu)(tcu)(p)
(tu)(tcup)
(tut)(c)(u)(p)
(tut)(c)(up)
(tut)(cu)(p)
(tut)(cup)
(tutc)(u)(p)
(tutc)(up)
(tutcu)(p)
(tutcup)

Mötərizədə bir simli qırmaq üçün bütün mümkün yolları çap etmək üçün mürəkkəblik təhlili

Zamanın mürəkkəbliyi

O (n ^ 2) hara n "s" simli ölçüsüdür.

Kosmik Mürəkkəblik

O (n ^ 2) hara n simli ölçüsüdür. Burada cavab almaq üçün hər simvoldan sonra bir simli elan edirik.

Crack Sistemi Dizayn Müsahibələri
Translate »