Advertisement
epidzhx

strings_matlab

Mar 25th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 5.27 KB | None | 0 0
  1. function x = strings(str1 = "-12 A4BCD 67 -89 hfj-7jf-12 2.2 22", str2 = "-1.2 AB4.4CD 2.3 -6.7 -6.7. 89 hfj7.7jf 2.2")
  2.  
  3. % function x = strings(str1 = "89 12", str2 = "89 5555")
  4.     intnums = integers(str1)
  5.     floatnums = doubles(str2)
  6.     hemmingDist = hemming(str1, str2)
  7.     levenshteinDist = levenshtein(str1, str2)
  8. end
  9.  
  10.  
  11. function ans = integers(str)
  12. % state:
  13. % 1 - был разделитель
  14. % 2 - было число
  15. % 0 - было не число и не разделитель
  16.  
  17.     state = 0;
  18.     ans = [];
  19.     settlers = [' ', ',', ';'];
  20.     nums = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
  21.     h = "";
  22.  
  23.     i = 1;
  24.     if ismember(str(i), nums)
  25.  
  26.         h = [h str(i)];
  27.         i = 2;
  28.         state = 2;
  29.     elseif (str(1) == '-')
  30.         state = 1;
  31.         h = [h str(1)];
  32.         i = 2;
  33.     end
  34.    
  35.     while (i <= length(str))
  36.  
  37.         ch = str(i);
  38.  
  39.         if (state == 0)
  40.  
  41.             if (ismember(ch, settlers))
  42.                 state = 1;
  43.             end
  44.         elseif (state == 1)
  45.  
  46.             if (ismember(ch, nums))
  47.                 h = [h ch];
  48.                 state = 2;
  49.             elseif (ismember(ch, settlers))
  50.                 state = 1;
  51.             elseif (ch == '-')
  52.                 state = 1;
  53.                 h = [h ch];
  54.             else
  55.                 state = 0;
  56.                 h = "";
  57.             end
  58.         else
  59.  
  60.             if (ismember(ch, nums))
  61.                 h = [h ch];
  62.             elseif (ismember(ch, settlers))
  63.                 ans = [ans; str2num(h)];
  64.                 h = "";
  65.                 state = 1;
  66.             else
  67.                 h = "";
  68.                 state = 0;
  69.             end
  70.         end
  71.         i+=1;
  72.     end
  73.  
  74.     if (state == 2)
  75.         ans = [ans; str2num(h)];
  76.     end
  77. end
  78.  
  79.  
  80. function ans = doubles(str)
  81. % state:
  82. % 1 - был разделитель
  83. % 2 - было число перед точкой
  84. % 3 - была точка
  85. % 4 - было число после точки
  86. % 0 - было не число, не точка и не разделитель
  87.  
  88.     ans = [];
  89.     settlers = [' ', ',', ';'];
  90.     nums = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
  91.     h = "";
  92.     state = 0;
  93.  
  94.     i = 1;
  95.     if ismember(str(i), nums)
  96.  
  97.         h = [h str(i)];
  98.         i = 2;
  99.         state = 2;
  100.     elseif (str(1) == '-')
  101.         state = 1;
  102.         h = [h str(1)];
  103.         i = 2;
  104.     end
  105.    
  106.     while (i <= length(str))
  107.  
  108.         ch = str(i);
  109.  
  110.         if (state == 0)
  111.        
  112.             if (ismember(ch, settlers))
  113.                 state = 1;
  114.             end
  115.         elseif (state == 1)
  116.  
  117.             if (ismember(ch, nums))
  118.                 h = [h ch];
  119.                 state = 2;
  120.             elseif (ch == '-') && (length(h) < 2)
  121.                 h = [h ch];
  122.             elseif (ismember(ch, settlers))
  123.                 h = "";
  124.             else
  125.                 h = "";
  126.                 state = 0;
  127.             end
  128.         elseif (state == 2)
  129.  
  130.             if (ismember(ch, nums))
  131.                 h = [h ch];
  132.             elseif (ch == '.')
  133.                 state = 3;
  134.                 h = [h ch];
  135.             elseif (ismember(ch, settlers))
  136.                 h = "";
  137.                 state = 1;
  138.             else
  139.                 h = "";
  140.                 state = 0;
  141.             end
  142.         elseif (state == 3)
  143.  
  144.             if (ismember(ch, nums))
  145.                 state = 4;
  146.                 h = [h ch];
  147.             elseif (ismember(ch, settlers))
  148.                 state = 1;
  149.                 h = "";
  150.             else
  151.                 h = "";
  152.                 state = 0;
  153.             end
  154.         else
  155.  
  156.             if (ismember(ch, nums))
  157.                 h = [h ch];
  158.             elseif (ismember(ch, settlers))
  159.                 ans = [ans; str2num(h)];
  160.                 state = 1;
  161.                 h = "";
  162.             else
  163.                 h = "";
  164.                 state = 0;
  165.             end
  166.         end
  167.        i+=1;
  168.     end
  169.  
  170.     if (state == 4)
  171.         ans = [ans; str2num(h)];
  172.     end
  173. end
  174.  
  175.  
  176. function ans = hemming(str1, str2)
  177. % выбираем максимальную по длине строку (для удобства)
  178. % идем по меньшей строке и проверяем равенство элементов
  179. % добавляем к ответу разницу в длине строк
  180.  
  181.     ans = 0;
  182.     if (length(str2) > length(str1))
  183.         c = str1;
  184.         str1 = str2;
  185.         str2 = c;
  186.     end
  187.  
  188.     for i=1:length(str2)
  189.         if (str1(i) != str2(i))
  190.             ans += 1;
  191.         end
  192.     end
  193.  
  194.     ans += length(str1) - length(str2);
  195. end
  196.  
  197.  
  198. function ans = levenshtein(str1, str2)
  199.  
  200.     ans = zeros(length(str1), length(str2));
  201.     for i=1:length(str1)
  202.         for j=1:length(str2)
  203.             if (i == 1) && (j == 1)
  204.                 ans(i, j) = 0;
  205.             elseif ((i > 1) && (j == 1))
  206.                 ans(i, j) = i;
  207.             elseif ((j > 1) && (i == 1))
  208.                 ans(i, j) = j;
  209.             else
  210.                 if (str1(i) == str2(j))
  211.                     t = 0;
  212.                 else
  213.                     t = 1;
  214.                 end
  215.                 ans(i, j) = min(min(ans(i, j - 1) + 1, ans(i - 1, j) + 1), ans(i - 1, j - 1) + t);
  216.             end
  217.         end
  218.     end
  219.     ans = ans(end, end);
  220. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement